Verzeichnisse durchlaufen - Fehler ignorieren

  • VB.NET

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

    Verzeichnisse durchlaufen - Fehler ignorieren

    Moin!

    ich möchte etwas mit den Verzeichnissen auf einer USB-Platte machen.

    Mächte diese nun alle durchlaufen und verwende

    VB.NET-Quellcode

    1. For Each FolderDatei As String In My.Computer.FileSystem.GetDirectories(LW, FileIO.SearchOption.SearchAllSubDirectories)


    Aber schon in dieser Zeile wird



    ausgegeben.

    Aber ein Try-Catch hilft hier ja schon nicht weiter.

    Kann man das dennoch irgendwie realsieren. Gerne kann das G:\$RECYCLE.BIN gänzlich ignoriert werden.

    Kann mir einer weiterhelfen?

    Jan
    "... ein Try-Catch hilft hier ja schon nicht weiter."
    Doch, tut er !
    Und verwende besser den IO. Namespace !
    @jan99 Du musst erst die Root-Verzeichnisse separat holen und die dann durchklickern:

    VB.NET-Quellcode

    1. Dim lws() = Directory.GetDirectories("C:\", "*", SearchOption.TopDirectoryOnly)
    2. For Each Folder As String In lws
    3. Try
    4. Dim lws2() = Directory.GetDirectories(Folder, "*", SearchOption.AllDirectories)
    5. ' hier mit den Verzeichnissen was tun
    6. Catch ex As Exception
    7. Continue For
    8. End Try
    9. Next
    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!
    Hallo,
    probiers mal mit EnumerateDirectories mit entsprechenden Optionen aus der Directory-Klasse

    VB.NET-Quellcode

    1. ​Dim directories = Directory.EnumerateDirectories("C:\", "*", New EnumerationOptions() With {
    2. .IgnoreInaccessible = True,
    3. .RecurseSubdirectories = True,
    4. .ReturnSpecialDirectories = False
    5. })
    @ErfinderDesRades Jou, habs eben mal mit NET 7 getestet.
    Allerdings glaube ich, dass @jan99 hier mit Framework arbeitet.
    ====
    Was nicht heißen soll, ich sei in .NET zu Hause. ;)
    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!
    Moin!

    erst einmal danke - ich werde es gleich einmal ausprobieren.

    Geil wieder etwas neues gehört "kein Framework und NET 7" - bin gespannt was da alles auf mich zukommt.

    Derzeit noch 4.7

    Jan

    PS: ich habe den Weg von RodFromGermany eingeschlagen.

    Es sind über 500.000 (ja richtig) Verzeichnisses in dem einen der Rootverzeichnisse.

    Muss man da eventuell noch einen anderen Weg einschlagen, weil im Debugger bekomme ich eine Fehlermeldung



    Vermutlich "hängt" sich das Programm schon beim Zusammentragen der Dateien auf. Meine Gedanken gehen in Richtung eines rekursiven aufruf, wie bei der ersten Ebene oder gibt es etwas besseres?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    jan99 schrieb:

    Fehlermeldung
    Da solltest Du schon mal Deinen Code posten.
    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!
    Moin!

    gerne komme ich der Frage nach...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Module Module1
    3. Sub Main()
    4. Dim LW As String = "G:\"
    5. Dim CountDir As Long = 0
    6. Dim CountFiles As Long = 0
    7. Dim CountFilesInSubRoot As Long = 0
    8. Console.WriteLine("Verzeichnisse zählen" & Environment.NewLine)
    9. Console.WriteLine(String.Format("Start: {0}", Now.ToString("dd.MM.yyyy - HH:mm:ss") & Environment.NewLine))
    10. Dim lws() = Directory.GetDirectories(LW, "*", SearchOption.TopDirectoryOnly)
    11. For Each Folder As String In lws
    12. CountFilesInSubRoot = 0
    13. Console.WriteLine(Folder & Environment.NewLine) ' Auflistung nur in der Root
    14. CountDir += 1
    15. Try
    16. Dim lws2() = Directory.GetDirectories(Folder, "*", SearchOption.AllDirectories)
    17. For Each Folder2 As String In lws2
    18. Try
    19. CountFilesInSubRoot += 1
    20. CountDir += 1
    21. Console.WriteLine("... " & Folder2)
    22. Catch ex As Exception
    23. Continue For
    24. End Try
    25. Next
    26. Catch ex As Exception
    27. Continue For
    28. End Try
    29. Console.WriteLine(String.Format("=> {0}", CountFilesInSubRoot.ToString) & Environment.NewLine)
    30. Next
    31. Console.WriteLine("Ergebnis" & Environment.NewLine)
    32. Console.WriteLine(String.Format("Verzeichnisse:= ... {0}", CountDir.ToString) & Environment.NewLine)
    33. Console.WriteLine(String.Format("Dateien:= ......... {0}", CountFiles.ToString) & Environment.NewLine)
    34. Console.WriteLine(String.Format("Ende: {0}", Now.ToString("dd.MM.yyyy - HH:mm:ss") & Environment.NewLine))
    35. End Sub
    36. End Module



    Gruß jan
    @jan99 OK, ich hab leider nur 10000 Verzeichnisse greifbar, da flutscht alles.
    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!

    schlechte MSDN-Übersetzung schrieb:

    Die EnumerateDirectories Methoden und GetDirectories unterscheiden sich wie folgt: Wenn Sie EnumerateDirectoriesverwenden,
    können Sie mit der Auflistung der Namen beginnen, bevor die gesamte
    Auflistung zurückgegeben wird. Wenn Sie verwenden GetDirectories,
    müssen Sie warten, bis das gesamte Array von Namen zurückgegeben wird,
    bevor Sie auf das Array zugreifen können. Wenn Sie mit vielen Dateien
    und Verzeichnissen arbeiten, EnumerateDirectories kann es daher effizienter sein.

    ansonsten zeile 22: von SearchOption.AllDirectories auf SearchOption.TopDirectoryOnly und weiter rekursiv durchsuchen

    fehlende Zitatquelle ergänzt ~VaporiZed

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()