Rekursiv file search

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von toto.

    Rekursiv file search

    Hallo an alle,

    habe einige Quellen um rekursiv files auflisten zu lassen.
    Alle scheitern mittendrin, und zwar werden alle Files ausgelistet,
    nur die Extensions, die FullName, die Size werden zur Hälfte dargestellt.

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Rekursiv(ByVal oDir As IO.DirectoryInfo)
    2. Dim oSubDir As IO.DirectoryInfo
    3. Dim oFile As IO.FileInfo
    4. Dim SubItemIndex As Integer
    5. Try
    6. ' zunächst alle Dateien des Ordners aufspüren
    7. For Each oFile In oDir.GetFiles()
    8. With oFile
    9. LVSong.Items.Add(System.IO.Path.GetFileNameWithoutExtension(oFile.ToString), SubItemIndex) 'Werden alle aufgelistet
    10. LVSong.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(oFile.ToString)) 'Werden bis zur Hälfte aufgelistet
    11. LVSong.Items(SubItemIndex).SubItems.Add(oFile.FullName.ToString()) 'Werden bis zur Hälfte aufgelistet
    12. LVSong.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(oFile.ToString)) 'Werden bis zur Hälfte aufgelistet
    13. LVSong.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(oFile.ToString)) 'Werden bis zur Hälfte aufgelistet
    14. LVSong.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(oFile.ToString)) 'Werden bis zur Hälfte aufgelistet
    15. LVSong.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(oFile.ToString)) 'Werden bis zur Hälfte aufgelistet
    16. LVSong.Items(SubItemIndex).SubItems.Add(Math.Round(oFile.Length / 10, 1) & " KB") 'Werden bis zur Hälfte aufgelistet
    17. SubItemIndex += 1
    18. sbr1.Text = "C:\BiaB Files" & " " & _
    19. LVSong.Items.Count & " Datei(en) " & _
    20. LVDoppelt.Items.Count & " Duplikate "
    21. End With
    22. Next
    23. Catch ex As Exception
    24. MsgBox(ex.ToString)
    25. End Try
    26. ' Jetzt alle Unterverzeichnis durchlaufen
    27. ' und die Prozedur rekursiv selbst aufrufen
    28. For Each oSubDir In oDir.GetDirectories()
    29. Rekursiv(oSubDir)
    30. Next
    31. End Sub


    Aufruf:

    VB.NET-Quellcode

    1. Private Sub btnAlleFiles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlleFiles.Click
    2. TreeView1.Nodes.Clear()
    3. LVSong.Items.Clear()
    4. Me.Cursor = Cursors.WaitCursor
    5. LVSong.BeginUpdate()
    6. Dim oDir As IO.DirectoryInfo
    7. oDir = New IO.DirectoryInfo("C:\BiaB Files")
    8. ' alle Dateien des Ordners ermitteln und in der ListView anzeigen
    9. Rekursiv(oDir)
    10. LVSong.EndUpdate()
    11. Me.Cursor = Cursors.Default
    12. btnAlleFiles.Enabled = False
    13. btnDuplikate.Enabled = True
    14. btnAlleDuplikate.Enabled = True
    15. End Sub


    ca. 50.000 Files

    Kann mir bitte jemand helfen den Fehler zu suchen?
    Danke im Voraus

    lg

    toto
    lg toto
    Hallo haiyyu,
    danke dir für die schnelle Antwort, musste leider gestern fort.
    Ja, es ist genug Platz vorhanden.
    Mit zu Hälfte meine ich das die Spalten bis ca. 10.000 files gefüllt werden, dann nicht mehr.
    Komischerweise der erste Spalte wird ganz gefüllt mit ca. 50.000 files.

    lg

    toto
    lg toto
    Kleine Anmerkungen am Rande:

    VB.NET-Quellcode

    1. IO.Path.GetExtension(oFile.ToString) = oFile.Extension
    2. IO.Path.GetFileNameWithoutExtension(oFile.ToString) = oFile.Name.Replace(oFile.Extension, "")
    3. oFile.FullName.ToString() = oFile.FullName ' FullName ist schon ein String, daher ToString unnötig
    4. oFile.ToString = oFile.FullName ' Besser erkennbar
    Hallo an alle.

    habe die Rekursion von X-Zat verwendet
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Parameter: pFolder als Pfad des zu durchsuchenden Ordners, pSuffix als Endung der zu suchenden Dateien (bei allen Typen "*.*")
    2. Public Function GetFiles(ByVal pFolder As String, ByVal pSuffix As String) As List(Of ListViewItem) 'Gibt eine Auflistung von ListViewItems zurück
    3. 'Eine temporäre Liste wird angelegt
    4. Dim TempLVI As New List(Of ListViewItem)
    5. 'Für jede Datei des Typs pSuffix im Ordner pFolder...
    6. For Each FILE As String In System.IO.Directory.GetFiles(pFolder, "*." & pSuffix, IO.SearchOption.TopDirectoryOnly)
    7. 'Erstelle neues ListViewItem und weise ihm Beizeichnung und Informationen in den Subitems zu
    8. Dim LVI As New ListViewItem
    9. LVI.Text = New System.IO.FileInfo(FILE).Name 'Dateiname
    10. With LVI
    11. .SubItems.Add(New System.IO.FileInfo(FILE).Directory.FullName) 'Ordner der Datei
    12. .SubItems.Add(Math.Round(New System.IO.FileInfo(FILE).Length / 1000, 2) & " KB") 'Größe der Datei (hier in KB, bis auf zwei Dezimalstellen gerundet
    13. 'Natürlich können hier noch Subitems hinzugefügt werden...
    14. End With
    15. 'Füge das ListViewItem der Liste hinzu
    16. TempLVI.Add(LVI)
    17. Next
    18. 'Für jeden Unterordner FOLDER des Ordners pFolder
    19. For Each FOLDER As String In System.IO.Directory.GetDirectories(pFolder)
    20. 'Für jedes ListViewItem LVI der zurückgegebenen Liste der rekursiv aufgerufenen Funktion
    21. For Each LVI As ListViewItem In GetFiles(FOLDER)
    22. 'Füge der temporären Liste die Ergebnisse des rekursiven Aufrufes hinzu
    23. TempLVI.Add(LVI)
    24. Next
    25. Next
    26. 'Gebe die komplette Liste zurück
    27. Return TempLVI
    28. End Function
    29. 'Beispiel für ein eigenes Programm:
    30. For Each LVI As ListViewItem In GetFiles("C:\","*")
    31. ListView1.Items.Add(LVI)
    32. Next





    Und bei mir so angepasst:

    VB.NET-Quellcode

    1. 'Parameter: pFolder als Pfad des zu durchsuchenden Ordners, pSuffix als Endung der zu suchenden Dateien (bei allen Typen "*.*")
    2. Public Function GetFiles(ByVal pFolder As String, ByVal pSuffix As String) As List(Of ListViewItem) 'Gibt eine Auflistung von ListViewItems zurück
    3. 'Eine temporäre Liste wird angelegt
    4. Dim TempLVI As New List(Of ListViewItem)
    5. 'Für jede Datei des Typs pSuffix im Ordner pFolder...
    6. For Each FILE As String In System.IO.Directory.GetFiles(pFolder, "*." & pSuffix, IO.SearchOption.TopDirectoryOnly)
    7. 'Erstelle neues ListViewItem und weise ihm Beizeichnung und Informationen in den Subitems zu
    8. Dim LVI As New ListViewItem
    9. LVI.Text = New System.IO.FileInfo(FILE).Name 'Dateiname
    10. With LVI
    11. .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Extension
    12. .SubItems.Add(New System.IO.FileInfo(FILE).Directory.FullName) 'Ordner der Datei
    13. .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Stil
    14. .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Inklusiv
    15. .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Tempo
    16. .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Key
    17. .SubItems.Add(Math.Round(New System.IO.FileInfo(FILE).Length / 1000, 2) & " KB") 'Größe der Datei (hier in KB, bis auf zwei Dezimalstellen gerundet
    18. 'Natürlich können hier noch Subitems hinzugefügt werden...
    19. End With
    20. 'Füge das ListViewItem der Liste hinzu
    21. TempLVI.Add(LVI)
    22. Next
    23. 'Für jeden Unterordner FOLDER des Ordners pFolder
    24. For Each FOLDER As String In System.IO.Directory.GetDirectories(pFolder)
    25. 'Für jedes ListViewItem LVI der zurückgegebenen Liste der rekursiv aufgerufenen Funktion
    26. For Each LVI As ListViewItem In GetFiles(FOLDER, "*.") --------------------------------------> hier haben die meisten Probleme, einfach so übernehmen, der Suffix hat gefehlt
    27. 'Füge der temporären Liste die Ergebnisse des rekursiven Aufrufes hinzu
    28. TempLVI.Add(LVI)
    29. Next
    30. Next
    31. 'Gebe die komplette Liste zurück
    32. Return TempLVI
    33. End Function


    Aufruf

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'TreeView1.Nodes.Clear()
    3. LVSong.Items.Clear()
    4. Me.Cursor = Cursors.WaitCursor
    5. LVSong.BeginUpdate()
    6. For Each LVI As ListViewItem In GetFiles("hier ein pfad angeben", "*")
    7. LVSong.Items.Add(LVI)
    8. Next
    9. LVSong.EndUpdate()
    10. Me.Cursor = Cursors.Default
    11. End Sub


    Ist schneller als mein erster Code.

    lg

    toto

    @tamaleus, das dürfte dein Problem lösen
    lg toto
    .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Extension
    .SubItems.Add(New System.IO.FileInfo(FILE).Directory.FullName) 'Ordner der Datei
    .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Stil
    .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Inklusiv
    .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Tempo
    .SubItems.Add(New System.IO.FileInfo(FILE).Extension) 'Key


    Ich versuche zur Zeit die Tags auszulesen,
    Asgeklammert sind dann die Instanzen die mir noch fehlen,
    habe nur "Etension" hingeschrieben um zu schauen ob alle Spalte vollständig gefüllt werden.

    lg
    toto
    lg toto