Alle Dateien und Ordner des gesammten PCs auflisten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Alle Dateien und Ordner des gesammten PCs auflisten

    Hi,

    ich habe ei programm geschrieben, welches alle Dateien und Ordner des gesammten PCs auflisten soll.

    Hier mein Code:


    das in einem Thread:

    VB.NET-Quellcode

    1. Try
    2. akt_list_ausgabe("C:\")
    3. Catch : End Try


    und hier die Funktion:

    VB.NET-Quellcode

    1. Public Function akt_list_ausgabe(ByVal Folders)
    2. Try
    3. For Each Folder In IO.Directory.GetDirectories(Folders)
    4. ListBox2.Items.Add(Folder)
    5. ordner += 1
    6. For Each File In IO.Directory.GetFiles(Folder)
    7. ListBox1.Items.Add(File)
    8. files += 1
    9. Next
    10. For Each SubFolder In IO.Directory.GetDirectories(Folder)
    11. ListBox2.Items.Add(SubFolder)
    12. akt_list_ausgabe(SubFolder)
    13. ordner += 1
    14. Next
    15. Label2.Text = ordner
    16. Label4.Text = files
    17. Next
    18. Catch : End Try
    19. End Function


    und nur eine Frage: Ist das so richtig?


    Euer EsTari

    und nur eine Frage: Ist das so richtig?


    Eher nicht ... es werden ja nicht alle Folders durchlaufen. Du durchläufst die erste Folder-Ebene, daraus alle Files in dieser Folder-Ebene und danach nur noch die nächste Folder-Ebene, aber diese dann ohne Files.

    Du musst n-Ebenen durchlaufen. Wobei n völlig unbekannt ist, dass kann 1 aber auch genauso gut 1.000.000 sein.

    Da hilft nur rekursiver Aufruf, sprich für jede Folder-Ebene in einem Folder ruft die Funktion sich selber solange auf bis keine Folder-Ebene mehr vorhanden ist.

    Da wir das Thema erst vor ein paar Tagen hatten, hier mal ein simples Beispiel wie Du alle (wirklich alle ^^) Folder eines Verzeichnisses durchläufst und aus jedem einzelnen Folder die Files. Als Verarbeitung ist hier eine einfache Zählung eingebaut. Das Beispiel dient natürlich nur als Grob-Prinzip weil es sehr simple ist und ausser Zählung keinerlei Verarbeitung beinhaltet, allerdings ist es imho mit einer der schnellsten Varianten die möglich ist (was bei großen Verzeichnissen durchaus von Vorteil ist). Entry-Point für einen Test ist natürlich TestDirRekursiv.

    VB.NET-Quellcode

    1. Private m_FolderCounter As Integer = 0
    2. Private m_FileCounter As Integer = 0
    3. Public Function TestDirRekursiv() As String
    4. m_FolderCounter = 0
    5. m_FileCounter = 0
    6. DirRekursiv("C:\")
    7. Return "Abgearbeitete Ordner: " & m_FolderCounter & " /Abgearbeitete Files: " & m_FileCounter
    8. End Function
    9. Public Sub DirRekursiv(ByVal strDir As String)
    10. Dim Folder As String = ""
    11. Dim File As String = ""
    12. Try
    13. For Each Folder In System.IO.Directory.GetDirectories(strDir)
    14. m_FolderCounter += 1
    15. For Each File In System.IO.Directory.GetFiles(Folder)
    16. m_FileCounter += 1
    17. Next
    18. If System.IO.Directory.GetDirectories(Folder).GetUpperBound(0) > 0 Then
    19. DirRekursiv(Folder)
    20. End If
    21. Next Folder
    22. Catch
    23. Debug.Print("Kein Zugriff möglich: " & Folder)
    24. End Try
    25. End Sub


    Hoffe das hilft Dir weiter.

    Gruß

    Rainer
    Vielen Dank :)

    klappt soweit sehr gut.

    jetzt sieht die auflistung auch wesentlich besser aus!

    aber ein problem gibt es trd noch:

    Die dateien die in "C:\" DIREKT sind werden nicht aufgelistet
    und was die ordner betrifft, bleibt er bei "System Volume Information" hängen.

    KnifeHunter schrieb:

    Die dateien die in "C:\" DIREKT sind werden nicht aufgelistet
    und was die ordner betrifft, bleibt er bei "System Volume Information" hängen.


    Punkt 1:

    Ist klar, weil der Aufruf so wie er ist nur aus den Ordnern des übergebenen Directorys liest. Übergibst Du also "C:\" als Start-Dir dann werden nur alle Ordner von C durchlaufen aber nicht die Files die in C selber liegen.

    Machst Du dann als simpler Ansatz so:

    VB.NET-Quellcode

    1. Public Sub DirRekursiv(ByVal strDir As String)
    2. Dim Folder As String = ""
    3. Dim File As String = ""
    4. Try
    5. For Each File In System.IO.Directory.GetFiles(strDir)
    6. m_FileCounter += 1
    7. Next
    8. For Each Folder In System.IO.Directory.GetDirectories(strDir)
    9. m_FolderCounter += 1
    10. If System.IO.Directory.GetDirectories(Folder).GetUpperBound(0) > 0 Then
    11. DirRekursiv(Folder)
    12. Else
    13. For Each File In System.IO.Directory.GetFiles(Folder)
    14. m_FileCounter += 1
    15. Next
    16. End If
    17. Next Folder
    18. Catch
    19. Debug.Print("Kein Zugriff möglich: " & Folder)
    20. End Try
    21. End Sub


    Hast sich im Prinzip nur geändert das nur zuerst im übergebenen Directory die Files gelesen werden bevor die Folder abgearbeitet werden. Hat ein Folder SubFolder wird der Aufruf rekursiv gestartet und wiederum zuerst die Files aus dem SubFolder verarbeitet bevor die SubSubFolder dran kommen. Hat ein Folder aber keine weiteren SubFolders dann wird kein rekursiver Aufruf gestartet dafür aber seine Files verarbeitet.

    Punkt 2:

    Deswegen ist in meinem Code auch der Try-Catch-Block drinnen, da es einfach Folder gibt auf die der Zugriff systembedingt verwehrt wird. Das sind die gleichen Ordner auf die Du im Windows-Explorer klickst und Du eine Fehlermeldung bekommst das der Zugriff verweigert wurde. Also einfach über den Try-Catch-Block abfangen lassen wie in meinem Code und gut ist (natürlich werden dann dessen Files und dessen Unterordner nicht abbgearbeitet ... aber ist ja okay so da Du eh darauf keinen Zugriff bekommst ^^).

    Gruß

    Rainer

    KnifeHunter schrieb:

    danke und ist klar, dass der zugriff verweigert wird. aber theoretisch müsste das programm doch dann mit den anderen ordnern fortfahren. - macht es aber nicht.


    Verdammt ... you're right. ^^

    Musst den Try-Catch natürlich in die Schleife reinlegen anstatt aussen rum ... sorry, war nur für einen anderen Thread ein Versuchsaufbau um Zugriffszeiten zu messen und den habe ich da auf die Schnelle (und so wie es aussieht halb-brain-afk) runtergecoddet um zu zeigen das bei einem FAT-Zugriff das belegte Speichervolumen auf der Festplatte keine Rolle für die Abarbeitung spielt.

    Gruß

    Rainer

    VB.NET-Quellcode

    1. Sub GetFiles(ByVal Path As String)
    2. Try
    3. For Each f As String In Directory.GetFiles(Path)
    4. Console.WriteLine(f)
    5. Next
    6. For Each s As String In Directory.GetDirectories(Path)
    7. Console.WriteLine(s)
    8. GetFiles(s)
    9. Next
    10. Catch ex As UnauthorizedAccessException
    11. End Try
    12. End Sub

    so funktionert es(das console.writelin gg das austauschen wie du es gerne hättest)
    und aufrufen tust du es dann mit

    VB.NET-Quellcode

    1. For Each d As DriveInfo In DriveInfo.GetDrives
    2. GetFiles(d.Name)
    3. Next