Fehler beim Löschen von Verzeichnissen mit Inhalt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Fehler beim Löschen von Verzeichnissen mit Inhalt

    Habe aus der VB-Dokumentation gelernt, dass man Verzeichnisse mit Inhalt mit dem Befehl

    System.IO.Directory.Delete(Name des Verzeichnisses, True)

    löschen kann.

    Bei mir gibt es immer eine Fehlermeldung.
    Beispiel:
    Habe ein Verzeichnis I:\sync\sa0828\documents\Fax\ mit Unterverzeichnissen drafts\ und inbox\. Alle Verzeichnisse sind übrigens leer.

    Der Befehl

    System.IO.Directory.Delete("I:\sync\sa0828\documents\Fax\", True)

    führt aber immer zu der Meldung

    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten. Zusätzliche Informationen: Der Zugriff auf den Pfad "I:\sync\sa0828\documents\Fax\Drafts" wurde verweigert.

    Kann mir jemand sagen, was ich falsch mache?
    Klarer geht die Fehlermeldung doch nicht. Dir bzw. deinem Programm fehlen die Berechtigungen um dieses Verzeichnis zu löschen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @artnat Es gibt einige Windows-Ordner, die für dich gesperrt sind. Beim Durchsuchen tritt dasselbe Problem auf. Hier ein Beispiel-Sourcecode, welcher alle Ordner nach mp4-Dateien durchsucht und deren Pfade in eine ListBox schreibt. Hierbei werden gesperrte Ordner ausgelassen. Du kannst ja mal schauen, wie oft er in Zeile 38 (Continue For) hereinläuft.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public NotInheritable Class FormMain
    2. Private Deu As New System.Globalization.CultureInfo("de-DE")
    3. Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. End Sub
    5. Private Sub ButtonStart_Click(sender As Object, e As EventArgs) Handles ButtonStart.Click
    6. Dim DI As IO.DirectoryInfo
    7. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))
    8. ScanDirectory(DI)
    9. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))
    10. ScanDirectory(DI)
    11. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop))
    12. ScanDirectory(DI)
    13. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
    14. ScanDirectory(DI)
    15. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos))
    16. ScanDirectory(DI)
    17. DI = My.Computer.FileSystem.GetDirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic))
    18. ScanDirectory(DI)
    19. End Sub
    20. Private Sub ScanDirectory(ByVal _RootDirectory As IO.DirectoryInfo)
    21. Dim allowed_Extensions As New List(Of String) From {".mp4"}
    22. 'Hidden | ReparsePoint | NotContentIndexed | System | Directory = 9238
    23. 'Dies ist genau das Gesamtattribut bei Ordnern, bei denen eine Exception geworfen wird.
    24. Dim _9238 As Integer = IO.FileAttributes.Hidden Or IO.FileAttributes.ReparsePoint Or IO.FileAttributes.NotContentIndexed Or IO.FileAttributes.System Or IO.FileAttributes.Directory
    25. For Each _Directory As IO.DirectoryInfo In _RootDirectory.EnumerateDirectories 'für jeden Unterordner...
    26. If _Directory.Attributes() = _9238 Then 'gesperrte Windows-Ordner auslassen. Diese Abfrage hat den Vorteil, dass nicht mit Try Catch gearbeitet werden muss.
    27. Continue For
    28. End If
    29. For Each File As IO.FileInfo In _Directory.GetFiles
    30. Try
    31. If allowed_Extensions.Contains(File.Extension.ToLower(Deu)) Then
    32. ListBox1.Items.Add(_RootDirectory.ToString & "\" + _Directory.ToString & "\" + File.ToString)
    33. Else
    34. Exit For
    35. End If
    36. Catch ex As UnauthorizedAccessException
    37. ScanDirectory(_Directory)
    38. End Try
    39. Next
    40. Next
    41. End Sub
    42. End Class

    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!