Directory.GetFiles() -> Hardlinks -> Exception

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

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

    Directory.GetFiles() -> Hardlinks -> Exception

    Huhu Gemeinde.

    Ich entwickel momentan ein Sicherungstool/Wiederherstellungstool.
    In diesem Tool sind die Pfade schon definiert, die gesichert und wiedergestellt werden sollen.

    VB.NET-Quellcode

    1. Dim array() As String = {
    2. GetFolderPath(SpecialFolder.Desktop) + "\",
    3. GetFolderPath(SpecialFolder.UserProfile) + "\Downloads\",
    4. GetFolderPath(SpecialFolder.MyPictures) + "\",
    5. GetFolderPath(SpecialFolder.MyDocuments) + "\",
    6. GetFolderPath(SpecialFolder.MyMusic) + "\",
    7. GetFolderPath(SpecialFolder.MyVideos) + "\",
    8. GetFolderPath(SpecialFolder.Favorites) + "\",
    9. GetFolderPath(SpecialFolder.UserProfile) + "\Links\",
    10. GetFolderPath(SpecialFolder.ApplicationData) + "\Microsoft\Signatures\",
    11. GetFolderPath(SpecialFolder.ApplicationData) + "\SAP\",
    12. GetFolderPath(SpecialFolder.ApplicationData) + "\Microsoft\OneNote\",
    13. GetFolderPath(SpecialFolder.LocalApplicationData) + "\Microsoft\OneNote\"
    14. }


    Ergibt:

    XML-Quellcode

    1. 'C:\Users\[user]\Desktop\
    2. 'C:\Users\[user]\Downloads\
    3. 'C:\Users\[user]\Pictures\
    4. 'C:\Users\[user]\Dokumente\
    5. 'C:\Users\[user]\Musik\
    6. 'C:\Users\[user]\Videos\
    7. 'C:\Users\[user]\Favorites\
    8. 'C:\Users\[user]\Links\
    9. 'C:\Users\[user]\AppData\Roaming\Microsoft\Signatures\
    10. 'C:\Users\[user]\AppData\Roaming\SAP\
    11. 'C:\Users\[user]\AppData\Roaming\Microsoft\OneNote\
    12. 'C:\Users\[user]\AppData\Local\Microsoft\OneNote\


    Dann in eine ListCheckBox hinzugefügt mit der entsprechenden Ordnergröße. Zudem die Ergebnisse in eine XML-Datei geschrieben, um später die Wiederherstellung vornehmen zu können.

    Die CheckListBox befindet sich wiederum in einer GroupBox. GroupBox.Text = "[Gesamtgröße der Ordner]"

    VB.NET-Quellcode

    1. For Each value As String In array
    2. If Helper.CheckFolderExist(value.ToString()) Then
    3. 'Ordner vorhanden
    4. 'clb_LocalData.Items.Add(value, True)
    5. clb_LocalData.Items.Add(String.Format("{0} - {1}", value, Helper.FormatBytes(Helper.GetDirectorySize(value), "0.00")), True)
    6. foldersize += Helper.GetDirectorySize(value)
    7. Else
    8. 'Ordner nicht vorhanden
    9. 'clb_LocalData.Items.Add(String.Format("{0}", value, False))
    10. End If
    11. Next


    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Ermittelt die Ördnergröße in Bytes
    3. ''' </summary>
    4. ''' <param name="path"></param>
    5. ''' <returns></returns>
    6. Public Shared Function GetDirectorySize(ByVal path As String) As Long
    7. 'onair
    8. Dim dir_size As Long = 0
    9. 'Try
    10. Dim files() As String = Directory.GetFiles(path, "*", SearchOption.AllDirectories) 'System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "C:\Users\[User]\Documents\My Music" wurde verweigert."
    11. For Each file As String In files
    12. Dim info As New FileInfo(file)
    13. dir_size += info.Length
    14. Next file
    15. 'Catch ex As UnauthorizedAccessException
    16. 'Catch ex As Exception
    17. 'End Try
    18. Return dir_size
    19. End Function


    Das Problem ist der Ordner C:\Users\[user]\Dokumente\. In diesem befinden sich 3 Hardlinks (zumindest habe ich gelesen, dass diese die Bezeichnung haben).

    VB.NET-Quellcode

    1. 'Check Hardlinks in C:\users\[user]\doucments\[hardlinks]
    2. Dim hardlinks() As String = {
    3. GetFolderPath(SpecialFolder.MyDocuments) + "\My Music",
    4. GetFolderPath(SpecialFolder.MyDocuments) + "\My Pictures",
    5. GetFolderPath(SpecialFolder.MyDocuments) + "\My Videos"
    6. }


    VB.NET-Quellcode

    1. Dim files() As String = Directory.GetFiles(path, "*", SearchOption.AllDirectories)

    Error: System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "C:\Users\[User]\Documents\My Music" wurde verweigert."

    Ich habe keinen Schimmer, wie ich die drei Hardlinks (Ordner) ignorieren kann.
    Ja, mit Catch ex As UnauthorizedAccessException klappt das auch, aber dann bricht dort ab und geht zum nächsten Ordner und die Ordnergröße von C:\Users\[user]\Dokumente\ ist 0 Byte.

    Wie könne man das lösen?

    Hatte schon so gedacht, vorher zu überprüfen, ob die Ordner vorhanden sind - falls doch, dann löschen, aber hier wiederum benötigt man Adminrechte. Das Programm soll aber nicht mit Adminrechte gestartet werden.
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    Und was hindert Dich jetzt, die Pfade einzeln zu prüfen, ob da ne Exception mit GetFiles kommt? Nur weil Du die drei in ein Array packst, musst Du sie doch nicht alle gleichzeitig prüfen.

    VB.NET-Quellcode

    1. For Each HardcodedPath In hardlinks
    2. Try
    3. Dim files() As String = Directory.GetFiles(HardcodedPath, "*", SearchOption.AllDirectories)
    4. '...
    5. Catch UAEx As UnauthorizedAccessException
    6. End Try
    7. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Eigentlich aus diesem Grund.

    JackCimberly schrieb:

    Hatte schon so gedacht, vorher zu überprüfen, ob die Ordner vorhanden sind - falls doch, dann löschen, aber hier wiederum benötigt man Adminrechte. Das Programm soll aber nicht mit Adminrechte gestartet werden.


    Das Array habe ich nur angelegt, dass ich damit irgendwas machen kann .... was ja noch offen ist.

    Oder verstehe ich Dich da falsch?
    Wenn ich die vorher prüfe, ob die Hardlinks vorhanden sind, was bringt mir das? Es wird ja dann dennoch C:\Users\[user]\Dokumente\ durchsucht - Fehler würde dann wieder kommen.
    Hm .... ?( ?(
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    Ah, ok, hilft Dir nicht weiter. Mit folgendem bekomm ich eine Größenangabe:

    VB.NET-Quellcode

    1. Public Function GetDirectorySize(ByVal path As String) As Long
    2. 'onair
    3. Dim dir_size As Long = 0
    4. Try
    5. Dim files() As String = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly)
    6. For Each file As String In files
    7. Dim info As New FileInfo(file)
    8. dir_size += info.Length
    9. Next file
    10. Catch ex As UnauthorizedAccessException
    11. 'Catch ex As Exception
    12. End Try
    13. Try
    14. Dim Dirs = Directory.GetDirectories(path)
    15. For Each Dir In Dirs
    16. dir_size += GetDirectorySize(Dir)
    17. Next
    18. Catch ex As UnauthorizedAccessException
    19. End Try
    20. Return dir_size
    21. End Function
    Also: Erstmal nur die Dateien durchgehen und erst dann die Sub-Directories. Das läuft letztenendes vom Prinzip her ab wie ne rekursive Verzeichnissuche. Ich verlinke gleich mal einen passenden Thread.

    ##########

    Gibt mehrere, unter anderem Durchsuchen von Ordnern mit Ordnertiefe (obwohl die Ordnertiefe bei Dir irrelevant ist).
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @JackCimberly Für den Fall, dass Dein Virenscanner diese Verzeicnisse besonders schützt (z.B. BitDefender), starte Dein Programm mal als Administrator.
    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!
    @VaporiZed
    Ach verdammt, da hatte was gefehlt - klar. *Stirn-klatsch* ^^

    Tante Edit:
    @RodFromGermany
    Ne, Gott sei Dank nicht. Danke für den Hinweis.
    Das Programm soll später ohne Admin-Rechte ausgeführt werden.
    Problem waren nur diese *pieeeep* Hardlinks. Wobei ich echt nicht verstehe, warum diese existieren.


    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

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

    JackCimberly schrieb:

    Hinweis
    Das ist mir gerade passiert.
    Ich habe per BitDefender mein Projekt-Verzeichnis geschützt und kann nun kann ich nicht mehr ohne Admin-Rechte da rein scheiben.
    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!