VB.Net file properties (pdf, office)

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    VB.Net file properties (pdf, office)

    Hallo zusammen,

    ich versuche eine Funktion zu erweitern und komme nicht weiter.
    Ich habe eine Suchfunktion und die Ergebnisse werden in der Listbox aufgelistet.
    Alle Dateien (Office und pdf) haben Zusatzinformationen unter Dateieigenschaften (Autor, Comments, Tags) und das möchte ich auch in Listbox auflisten.
    Wie kann ich es am besten realisieren?

    Gruß
    Alex

    Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private paths() As String = {"x"}
    4. Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
    5. On Error Resume Next
    6. Process.Start(paths(ListBox1.SelectedIndices(0) + 1))
    7. End Sub
    8. Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
    9. 'On Error GoTo ErrorHandler
    10. On Error Resume Next
    11. If e.Index < 0 Then Exit Sub
    12. ' Text, der angezeigt werden soll
    13. Dim sData As String = ListBox1.Items(e.Index).ToString
    14. ' Schriftart
    15. Dim oFont As Font = ListBox1.Font
    16. ' Hintergrund zeichnen
    17. e.DrawBackground()
    18. With e.Graphics
    19. ' jede 2. Zeile einfärben
    20. ' aber nur, wenn die Zeile nicht selektiert ist
    21. If (e.State And DrawItemState.Selected) = 0 AndAlso e.Index Mod 2 = 0 Then
    22. .FillRectangle(Brushes.WhiteSmoke, e.Bounds)
    23. End If
    24. ' Text ausgeben
    25. .DrawString(sData, oFont, New SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y)
    26. End With
    27. End Sub
    28. Private Sub ListBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyDown
    29. On Error Resume Next
    30. If e.KeyCode = Keys.Enter Then ' Wenn in Combobox4 Enter gedrückt wird..
    31. Process.Start(paths(ListBox1.SelectedIndices(0) + 1))
    32. End If
    33. End Sub
    34. Private Sub FilesToListbox(ByVal lboFiles As ListBox, _
    35. ByVal DirectoryToSearch() As String, ByVal Searchpattern() As String)
    36. lboFiles.DataSource = Nothing
    37. Dim Filetable As New DataTable
    38. If FilesToDatatable(Filetable, DirectoryToSearch, Searchpattern) < 1 Then
    39. MsgBox("Keine Dateien gefunden")
    40. Exit Sub
    41. End If
    42. Dim bsFiles As New BindingSource
    43. bsFiles.DataSource = Filetable
    44. lboFiles.DisplayMember = "FileName"
    45. lboFiles.DataSource = bsFiles
    46. bsFiles.Sort = "FileName ASC" 'Sortierspalte(n) und Richtung angeben
    47. 'bsFiles.Filter Filterkriterium angeben
    48. End Sub
    49. Private Function FilesToDatatable(ByVal FileTable As DataTable, _
    50. ByVal DirectoryToSearch() As String, _
    51. ByVal Searchpattern() As String) As Integer
    52. ProgressBar1.Value = 0
    53. If FileTable Is Nothing Then FileTable = New DataTable
    54. If Not FileTable.Columns.Contains("FileName") Then
    55. FileTable.Columns.Add(New DataColumn("FileName", GetType(String)))
    56. End If
    57. If Not FileTable.Columns.Contains("FilePath") Then
    58. FileTable.Columns.Add(New DataColumn("FilePath", GetType(String)))
    59. End If
    60. FileTable.Rows.Clear()
    61. Try
    62. For Each direc As String In DirectoryToSearch
    63. If IO.Directory.Exists(direc) Then
    64. For Each sp As String In Searchpattern
    65. For Each file As String In IO.Directory.GetFiles(direc, _
    66. sp)
    67. FileTable.Rows.Add(IO.Path.GetFileName(file), direc)
    68. Next file
    69. Next sp
    70. End If
    71. Next direc
    72. Return FileTable.Rows.Count
    73. Catch ex As Exception
    74. Return -1
    75. End Try
    76. End Function
    77. Private Function searchFiles(ByVal dPath As DirectoryInfo, ByVal _
    78. lSearchpattern As List(Of String)) As List(Of FileInfo)
    79. Dim lFiles As List(Of FileInfo) = New List(Of FileInfo)
    80. On Error Resume Next
    81. For Each sPattern As String In lSearchpattern
    82. For Each fiFile As FileInfo In dPath.GetFiles(sPattern, SearchOption.AllDirectories)
    83. lFiles.Add(fiFile)
    84. Next
    85. Next
    86. Return lFiles
    87. End Function
    88. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    89. Dim dInitPath As DirectoryInfo
    90. Dim lSearchpattern As List(Of String)
    91. Dim lFiles As List(Of FileInfo)
    92. ProgressBar1.Value = 0
    93. ProgressBar1.Style = ProgressBarStyle.Continuous
    94. ListBox1.Items.Clear()
    95. ReDim paths(0)
    96. lSearchpattern = New List(Of String)
    97. lSearchpattern.Add("*" & ComboBox2.Text & "*" & "*" & TextBox1.Text & "*" & "*" & ComboBox1.Text & "*" & "*" & TextBox2.Text & "*" & "*." & "*")
    98. dInitPath = New IO.DirectoryInfo(".\Datenbank\Produkte")
    99. lFiles = searchFiles(dInitPath, lSearchpattern)
    100. For Each fiFile As FileInfo In lFiles
    101. ListBox1.Items.Add(fiFile.Name)
    102. ReDim Preserve paths(paths.Length)
    103. paths(paths.Length - 1) = fiFile.FullName
    104. ProgressBar1.Increment(1)
    105. If ProgressBar1.Value = 100 Then
    106. End If
    107. ProgressBar1.Maximum = lFiles.Count
    108. Next
    109. End Sub

    alex-fw schrieb:

    Wie kann ich es am besten realisieren?
    Fang an und schmeiß alle Zeilen mit On Error ... ersatzlos raus.
    Wenn es dann knallt, sieh Dir die Fehlermeldung an und reagiere im Code entsprechend mit dem Abfangen expliziter Exceptions.
    Schmeiß ReDim ... raus und ersetze die Arrays durch List(Of T).
    Trenne Daten und GUI, oder was soll dies hier:

    VB.NET-Quellcode

    1. If ProgressBar1.Value = 100 Then
    2. End If

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    alex-fw schrieb:

    Alle Dateien (Office und pdf) haben Zusatzinformationen unter Dateieigenschaften (Autor, Comments, Tags) und das möchte ich auch in Listbox auflisten.


    Hi RodFromGermany,
    danke für den Tipp.
    Die Code ist noch in der Entwicklung und ich muss noch viel was ändern,mir fehlt montan die Lösung, wie ich Dateieigenschaften auslesen und auflisten kann.
    das weiß er vmtl. nicht, und ich übrigens auch nicht. Google halt "erweiterte Dateieigenschaften" , oder "word: erweiterte Dateieigenschaften" , oder auf englisch - vlt. gibts da ja was.
    vor ca. 10 Jahren hatte ich mal die extended properties für BildDateien ausgefummelt - iwas mit GetFolderDetails - aber das ist ziemlich umständlich, ging iwie mit einem Com-Objekt und so.

    Aber was du auf jeden Fall machen kannst und solltest, erstmal wie von Rod gesagt, deinen Stil verbessern - das kann man jederzeit machen, und je früher desto besser, und auch bevor du gelöst hast, was dir dein aktuelles Problem erscheint.
    Insbesondere Visual Studio - Empfohlene Einstellungen umzusetzen ist schoma ein gutes Einstiegs-Paket.
    ich hab jetzt nochmal rumgegooglet - das Com-Teil, was ich meinte heisst "ShellFolderView", und hat eine Methode "GetFolderDetails".
    Aber ist nix für Anfänger.
    Um damit klarzukommen, musst du erstmal das Datentyp-Konzept verinnerlicht haben und .net-mäßig programmieren lernen (die gegebenen Links helfen dir dabei).
    Dann wieder lernen, dagegen zu verstoßen, debuggen, Schnittstellen, Com-Schnittstellen, Resourcenbereinigung, Resourcenbereinigung speziell von Com-Objekten und evtl. Einbindung von Win-Api-Funktionalität und so Zeugs.
    Ach und GetFolderDetails liefert auch je nach Win-Version jeweils andere extended File-Properties.