Verzeichnisgröße berechnen

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

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Hi,
    ich habe eine kleine Sub, welche nur die lesbaren Ordner und Objekte berücksichtigen sollte.
    Diese gibt die Anzahl der in einem vorgegebenen Stammordner enthaltenen Unterordner, die Gesamtzahl aller enthaltenen Dateien und in einer Liste alle enthaltenen Dateien zurück.
    Diese Sub verwende ich für alle möglichen Aufgaben.

    EDIT: Aber ich lasse auch auf dem System-Laufwerk nur das Einlesen von:
    Sysdrive:\Benutzer\Öffentlich\Öffentliche Dokumente
    Sysdrive:\Benutzer\Öffentlich\Öffentliche Downloads
    Sysdrive:\Benutzer\Öffentlich\Öffentliche Bilder
    Sysdrive:\Benutzer\Öffentlich\Öffentliche Musik
    Sysdrive:\Benutzer\Öffentlich\Öffentliche Videos
    und
    Sysdrive:\Benutzer\%Benutzername%\Dokumente
    Sysdrive:\Benutzer\%Benutzername%\Downloads
    Sysdrive:\Benutzer\%Benutzername%\Bilder
    Sysdrive:\Benutzer\%Benutzername%\Musik
    Sysdrive:\Benutzer\%Benutzername%\Videos

    Als Quellordner zu, um Zugriffssperren zu vermeiden.

    Diese lese ich mit:
    Dim allUsers As String = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Windows).Replace("Windows", "Users"))
    Dim commonDocuments As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
    Dim commonDownloads As String = Path.Combine(allUsers, "Public\Downloads")
    Dim commonMusic As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonMusic)
    Dim commonPictures As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures)
    Dim commonVideos As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonVideos)

    und

    Dim myDocuments As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    Dim myDownloads As String = IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads")
    Dim myMusic As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
    Dim myPictures As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
    Dim myVideos As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyVideos)

    aus den System-Einstellungen aus.


    Mit

    VB.NET-Quellcode

    1. searchOption = SearchOption.AllDirectories

    werden alle Unterordner durchsucht

    Mit

    VB.NET-Quellcode

    1. searchOption = SearchOption.AllDirectories

    wird nur die Stammebene eingelesen

    VB.NET-Quellcode

    1. Private Sub Stammverzeichnis einlesen(verzeichnis As String, searchOption)
    2. fileList.Clear()
    3. foldercount = 0
    4. filecount = 0
    5. TraverseDirectory(verzeichnis, SearchOption, fileList, foldercount, filecount)
    6. ' Nach dem Aufruf enthält:
    7. ' filelist : Liste aller enthaltenen Dateien
    8. ' Foldercount : Anzahl der enthaltenen Verzeichnisse
    9. ' Filecount : Anzahl aller enthaltenen Dateien
    10. End If
    11. Private Sub TraverseDirectory(ByVal directory As String, ByVal searchOption As SearchOption, ByRef fileList As List(Of String), ByRef folderCount As Integer, ByRef fileCount As Integer)
    12. Try
    13. If (searchOption = SearchOption.AllDirectories) Then
    14. ' Alle Dateien im aktuellen Verzeichnis hinzufügen
    15. Dim filesInDirectory As String() = IO.Directory.GetFiles(directory)
    16. fileList.AddRange(filesInDirectory)
    17. fileCount += filesInDirectory.Length
    18. ' Anzahl der enthaltenen Ordner erhöhen
    19. folderCount += 1
    20. ' Rekursiv die Unterverzeichnisse durchlaufen
    21. For Each subDirectory As String In IO.Directory.GetDirectories(directory)
    22. TraverseDirectory(subDirectory, searchOption, fileList, folderCount, fileCount)
    23. Next
    24. Else
    25. ' Nur Dateien im aktuellen Verzeichnis hinzufügen
    26. Dim filesInDirectory As String() = IO.Directory.GetFiles(directory)
    27. fileList.AddRange(filesInDirectory)
    28. fileCount += filesInDirectory.Length
    29. End If
    30. Catch ex As System.Exception
    31. ' Fehlerbehandlung hier
    32. End Try
    33. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Dideldum“ ()

    Moin moin

    Also ich habe mal umgebaut und bin dann doch wieder etwas, nein sehr "verwundert" über das "unlogische" Windows.

    Zum Beispiel:
    Der Pfad im Explorer: C:\Users\Fox\Pictures
    Der Pfad im Code: Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

    Der Pfad im Explorer: C:\Users\Fox\Downloads
    Der Pfad im Code: Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads")

    Warum ist der Eigene Ordner mal direkt ansprechbar und warum muss ich dann plötzlich einen Pfad zusammenbauen ?( ?(
    Warum ist die Schreibweise so unterschiedlich? "Pictures" "MyPictures" ?(


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class DirectorySizeCalculator
    2. ' Initialisierung der Listen und Zählvariablen
    3. Private ListofFiles As New List(Of String)()
    4. Private CountFolders As Integer = 0
    5. Private CountFiles As Integer = 0
    6. Private TotalBytes As Long = 0
    7. Public Sub ReadUserDirectorys()
    8. ' Liste der zu durchsuchenden Verzeichnisse
    9. Dim directories As String() = {
    10. Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
    11. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"),
    12. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Contacts"),
    13. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Saved Games"),
    14. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Links"),
    15. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Searches"),
    16. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData"),
    17. Environment.GetFolderPath(Environment.SpecialFolder.MyMusic),
    18. Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
    19. Environment.GetFolderPath(Environment.SpecialFolder.MyVideos),
    20. Environment.GetFolderPath(Environment.SpecialFolder.Favorites),
    21. Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
    22. Environment.GetFolderPath(Environment.SpecialFolder.Resources),
    23. Environment.GetFolderPath(Environment.SpecialFolder.History),
    24. Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    25. }
    26. 'Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData\Roaming"),
    27. 'Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData\LocalLow"),
    28. 'Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData\Local"),
    29. 'Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    30. ' Rücksetzen der Listen und Zählvariablen
    31. ListofFiles.Clear()
    32. CountFolders = 0
    33. CountFiles = 0
    34. TotalBytes = 0
    35. ' Durchlaufen und Verarbeiten der Verzeichnisse
    36. For Each dir As String In directories
    37. AnalyzeDirectory(dir, SearchOption.AllDirectories, ListofFiles, CountFolders, CountFiles, TotalBytes)
    38. Next
    39. ' Umrechnen der Bytes
    40. 'Dim totalSizeInGB As Double = totalBytes / 1073741824.0 ' Byte in Gigabyte umrechnen
    41. Dim totalSizeInMB As Double = TotalBytes / 1048576.0 ' Byte in Megabyte umrechnen
    42. ' Ausgabe der Ergebnisse
    43. Debug.WriteLine($"{NewCrlLf}Dateien: {CountFiles}{NewCrlLf}Ordner: {CountFolders}{NewCrlLf}Gesamtgröße: {totalSizeInMB:N2} MegaBytes{NewCrlLf}Gesamtgröße: {TotalBytes} Byte")
    44. 'MessageBox.Show($"Dateien: {fileCount}, Ordner: {folderCount}, Gesamtgröße: {totalSizeInMB:N2} MBytes")
    45. End Sub
    46. Private Sub AnalyzeDirectory(ByVal dirPath As String, ByVal searchOption As SearchOption, ByRef fileList As List(Of String), ByRef folderCount As Integer, ByRef fileCount As Integer, ByRef totalBytes As Long)
    47. Try
    48. ' Überprüfen, ob das Verzeichnis existiert
    49. If Directory.Exists(dirPath) Then
    50. ' Versuchen Sie, auf das Verzeichnis zuzugreifen
    51. Dim directoryInfo As New DirectoryInfo(dirPath)
    52. ' Prüfen Sie, ob Ihr Programm Zugriff auf das Verzeichnis hat
    53. If directoryInfo.Exists Then
    54. ' Alle Dateien im aktuellen Verzeichnis hinzufügen
    55. Dim filesInDirectory As String() = Directory.GetFiles(dirPath)
    56. fileList.AddRange(filesInDirectory)
    57. fileCount += filesInDirectory.Length
    58. For Each file As String In filesInDirectory
    59. totalBytes += New FileInfo(file).Length
    60. Next
    61. ' Anzahl der enthaltenen Ordner erhöhen
    62. folderCount += Directory.GetDirectories(dirPath).Length
    63. ' Rekursiv die Unterverzeichnisse durchlaufen, wenn AllDirectories gewählt ist
    64. If (searchOption = SearchOption.AllDirectories) Then
    65. For Each subDirectory As String In Directory.GetDirectories(dirPath)
    66. AnalyzeDirectory(subDirectory, searchOption, fileList, folderCount, fileCount, totalBytes)
    67. Next
    68. End If
    69. Else
    70. ' Verzeichnis existiert nicht oder Zugriff verweigert
    71. Debug.WriteLine($"Zugriff auf Verzeichnis {dirPath} verweigert.{NewCrlLf}")
    72. End If
    73. Else
    74. ' Verzeichnis existiert nicht
    75. Debug.WriteLine($"Verzeichnis {dirPath} existiert nicht.{NewCrlLf}")
    76. End If
    77. Catch ex As UnauthorizedAccessException
    78. ' Zugriff verweigert, Verzeichnis überspringen
    79. Debug.WriteLine($"Zugriff auf Verzeichnis {dirPath} verweigert:{NewCrlLf} {ex.Message}")
    80. Catch ex As DirectoryNotFoundException
    81. ' Verzeichnis nicht gefunden, Verzeichnis überspringen
    82. Debug.WriteLine($"Verzeichnis {dirPath} nicht gefunden:{NewCrlLf} {ex.Message}")
    83. Catch ex As PathTooLongException
    84. ' Pfad zu lang, Verzeichnis überspringen
    85. Debug.WriteLine($"Pfad zu lang für Verzeichnis {dirPath}:{NewCrlLf} {ex.Message}")
    86. Catch ex As IOException
    87. ' Ein-/Ausgabefehler, Verzeichnis überspringen
    88. Debug.WriteLine($"Ein-/Ausgabefehler beim Zugriff auf Verzeichnis {dirPath}:{NewCrlLf} {ex.Message}")
    89. Catch ex As Exception
    90. ' Andere Ausnahmen behandeln
    91. Debug.WriteLine($"Unbekannter Fehler beim Zugriff auf Verzeichnis {dirPath}:{NewCrlLf} {ex.Message}")
    92. End Try
    93. End Sub
    94. End Class


    DebugAusgaben:

    XML-Quellcode

    1. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Bilder verweigert:
    2. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Bilder" wurde verweigert.
    3. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Musik verweigert:
    4. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Musik" wurde verweigert.
    5. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Videos verweigert:
    6. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Videos" wurde verweigert.
    7. Zugriff auf Verzeichnis C:\Users\Fox\AppData\Local\Anwendungsdaten verweigert:
    8. Der Zugriff auf den Pfad "C:\Users\Fox\AppData\Local\Anwendungsdaten" wurde verweigert.
    9. Zugriff auf Verzeichnis C:\Users\Fox\AppData\Local\Temporary Internet Files verweigert:
    10. Der Zugriff auf den Pfad "C:\Users\Fox\AppData\Local\Temporary Internet Files" wurde verweigert.
    11. Zugriff auf Verzeichnis C:\Users\Fox\AppData\Local\Verlauf verweigert:
    12. Der Zugriff auf den Pfad "C:\Users\Fox\AppData\Local\Verlauf" wurde verweigert.
    13. Zugriff auf Verzeichnis C:\Users\Fox\AppData\Roaming\Microsoft\Windows\Start Menu\Programme verweigert:
    14. Der Zugriff auf den Pfad "C:\Users\Fox\AppData\Roaming\Microsoft\Windows\Start Menu\Programme" wurde verweigert.
    15. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Bilder verweigert:
    16. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Bilder" wurde verweigert.
    17. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Musik verweigert:
    18. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Musik" wurde verweigert.
    19. Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Videos verweigert:
    20. Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Videos" wurde verweigert.
    21. Dateien: 42853
    22. Ordner: 2477
    23. Gesamtgröße: 1.354,44 MegaBytes
    24. Gesamtgröße: 1420236589 Byte
    25. Angabe vom Explorer (ganze Benutzerverzeichnis)
    26. Dateien: 42873
    27. Ordner: 2424
    28. Größe: 1,34GB ( 1.444.050.300 )


    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Also was weiterhin auffällt ist, dass alle Fehler bei einem Pfad kommen der deutsch endet.
    Vielleicht gehört das zu den allgemeinen Problemen die @slice erwähnte.

    Im Deutschen gibt es auch Bilder und Eigene Bilder. Vielleicht macht das noch n Unterschied?

    Amelie schrieb:

    Der Pfad im Explorer: C:\Users\Fox\Pictures
    Der Pfad im Code: Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

    Der Pfad im Explorer: C:\Users\Fox\Downloads
    Der Pfad im Code: Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads")

    Warum ist der Eigene Ordner mal direkt ansprechbar und warum muss ich dann plötzlich einen Pfad zusammenbauen
    SpecialFolder enthält eine Auflistung an Pfaden, wenn Downloads da nicht mit aufgenommen wurde, dann musst du natürlich selbst hin navigieren.

    Nur so nebenbei bei mir wird von SpecialFolder auch der deutsche Pfadname zurückgegeben. Also ich habe da "Bilder" stehen. Und nicht Pictures.

    Aber hast du denn mal versucht den Pfad einfach selbst einzugeben? Außerdem würde ich vorschlagen, damit wir mit diesen Namen-Wirrungen nicht in die Bredouille kommen, du legst mal ein Netzlaufwerk an das zu einem dieser Fehlerpfade verlinkt ist, dann gibt es sicher keine Namenskonflikte mehr.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @Haudruferzappeltnoch
    Wie / was meinst du mit den beiden Sachen?
    Aber hast du denn mal versucht den Pfad einfach selbst einzugeben?


    Netzlaufwerk an das zu einem dieser Fehlerpfade verlinkt ist...


    Der Pfad im Explorer: C:\Users\Fox\Pictures
    Das zeigt der Expolrer, wenn ich auf Eigenschaften / Pfad schaue. Im Eigentlichen Verzeichnisbaum steht auch Bilder usw.. eben alles in Deutsch.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    selbst eingeben? Na einfach den String hinschreiben. Ich weiß ja auch nicht von welchen Problemen slice redet, und ob man die umgehen kann, aber erstmal verwirrt mich unfassbar, das an verschiedenen Stellen im Code verschiedene Pfade stehen für denselben Ort.

    Netzlaufwerk geht scheinbar nicht, da muss ich nochmal schauen...
    Meinte natürlich ein substituiertes Laufwerk kein Netzlaufwerk, am Ende kommts aufs Selbe hinaus, dass du es von Hand eingibst. Nur beim Pfad kann man sich dann nicht vertippen. Die Zuordnung übernimmt dann außerdem Windows und man kann prüfen ob das ein Unterschied zu dem ist, was das Programm tut. Das ist was mir zu slices Einwänden eingefallen ist.

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

    Hi @Amelie

    Ich erhalte aus den SpecialFolders wie Du auch englische Bezeichnungen.
    Das ist m.W. von der Windows-Installations-Quelle abhängig.
    Aber das juckt ja nicht, wichtig ist, dass die Pfade mit der Nutzung der Specialfolders so ansprechbar sind, dass diese auf jedem System stimmen.
    Egal, ob der Benutzer die umbenannt oder den Pfad dieser Ordner im System geändert hat. ;)

    Das "My" in der Bezeichnung bedeutet (i.d.R) in den SpecialFolders, dass der betreffende Ordner im C:\Users\%Benutzername% enthalten ist.
    Das "Common" in der Bezeichnung bedeutet in den SpecialFolders, dass der betreffende Ordner im C:\Users\All Users\ liegt oder zumindest für alle User Geltung hat.
    Beginnt ein SpecialFolder mit anderen Zeichen, liegt der irgendwo anders auf der Systemplatte.
    Leider hat MS das eigentlich sinnvolle System nicht konsequent umgesetzt.
    So ist z.B. beim Desktop:
    System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirector der Desktop in "C:\Users\All Users\Desktop"
    während
    System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop und nicht wie zu erwarten wäre System.Environment.GetFolderPath(Environment.SpecialFolder.MyDesktop der Desktop des Benutzers in "C:\Users\%Benutzername%\Desktop"

    Ich nutze in meinem derzeitigen Projekt folgende Zuweisungen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim allUsers As String = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Windows).Replace("Windows", "Users"))
    2. Dim winDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Windows)
    3. Dim fontsDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Fonts)
    4. Dim localizedResources As String = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalizedResources) ' Leerer String
    5. Dim programFiles As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
    6. Dim programFilesX86 As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
    7. Dim resources As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Resources)
    8. Dim systemDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)
    9. Dim systemDir64 As String = System.Environment.GetFolderPath(Environment.SpecialFolder.SystemX86)
    10. Dim commonAdminTools As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonAdminTools)
    11. Dim commonAppData As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
    12. Dim commonDownloads As String = Path.Combine(allUsers, "Public\Downloads")
    13. Dim commonDesktop As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory)
    14. Dim commonDocuments As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
    15. Dim commonMusic As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonMusic)
    16. Dim commonOEMLinks As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks)
    17. Dim commonPictures As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures)
    18. Dim commonProgramFiles As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles)
    19. Dim commonProgramFilesX86 As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFilesX86)
    20. Dim commonPrograms As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms)
    21. Dim commonStartmenu As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
    22. Dim commonStartUp As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup)
    23. Dim commonTemplates As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonTemplates)
    24. Dim commonVideos As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonVideos)
    25. Dim myAdminTools As String = System.Environment.GetFolderPath(Environment.SpecialFolder.AdminTools)
    26. Dim myAppData As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    27. Dim myCDBurning As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CDBurning)
    28. Dim myComputer As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyComputer) ' leerer String
    29. Dim myCookiesDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies)
    30. Dim myDesktop As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    31. Dim MyDesktopDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) ' Doppelt = Desktop
    32. Dim myDocuments As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    33. Dim myDownloads As String = IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads")
    34. Dim myFavorites As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
    35. Dim myHistory As String = System.Environment.GetFolderPath(Environment.SpecialFolder.History)
    36. Dim myInternetCache As String = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)
    37. Dim myLocalAppData As String = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
    38. Dim myMusic As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
    39. Dim myNetworkShortcuts As String = System.Environment.GetFolderPath(Environment.SpecialFolder.NetworkShortcuts)
    40. Dim myPictures As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
    41. Dim myPrinterShortcuts As String = System.Environment.GetFolderPath(Environment.SpecialFolder.PrinterShortcuts)
    42. Dim myPrograms As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Programs)
    43. Dim myRecent As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Recent)
    44. Dim mySendTo As String = System.Environment.GetFolderPath(Environment.SpecialFolder.SendTo)
    45. Dim myStartmenu As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
    46. Dim myStartup As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Startup)
    47. Dim myTemplates As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Templates)
    48. Dim myUserProfile As String = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    49. Dim myVideos As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyVideos)


    Hier aus meinem Manual:
    Globale Platzhalter

    Platzhalter Aufruf Ziel

    %ProgramFiles% <file:%ProgramFiles%\> (<file:C:\Program Files\>)
    %CommonProgramFiles% <file:%CommonProgramFiles%\> (<file:C:\Program Files\Common Files\>)
    %ProgramFilesX86% <file:%ProgramFilesX86%\> (<file:C:\Program Files (x86)\>)
    %CommonProgramFilesX86% <file:%CommonProgramFilesX86%\> (<file:C:\Program Files (x86)\Common Files\>)

    %CommonAppData% <file:%CommonAppData%\> (<file:C:\ProgramData\>)
    %CommonStartMenu% <file:%CommonStartMenu%\> (<file:C:\ProgramData\Microsoft\Windows\Start Menu\>)
    %CommonPrograms% <file:%CommonPrograms%\> (<file:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\>)
    %CommonAdminTools% <file:%CommonAdminTools%\> (<file:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\>)
    %CommonStartUp% <file:%CommonStartUp%\> (<file:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\>)
    %CommonTemplates% <file:%CommonTemplates%\> (<file:C:\ProgramData\Microsoft\Windows\Templates\>)

    Benutzer-Ordner

    Platzhalter Aufruf Ziel

    %MyUserProfile% <file:%MyUserProfile%\> (<file:C:\Users\%Benutzername%\>)
    %MyLocalAppData% <file:%MyLocalAppData%\> (<file:C:\Users\%Benutzername%\AppData\Local\>)
    %MyCDBurning% <file:%MyCDBurning%\> (<file:C:\Users\%Benutzername%\AppData\Local\Microsoft\Windows\Burn\Burn\>)
    %MyHistory% <file:%MyHistory%\> (<file:C:\Users\%Benutzername%\AppData\Local\Microsoft\Windows\History\>)
    %MyInternetCache% <file:%MyInternetCache%\> (<file:C:\Users\%Benutzername%\AppData\Local\Microsoft\Windows\iNetCache\>)
    %MyCookiesDir% <file:%MyCookiesDir%\> (<file:C:\Users\%Benutzername%\AppData\Local\Microsoft\Windows\iNetCookies\>)
    %MyRoamingAppData% <file:%MyRoamingAppData%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\>)
    %MyNetworkShortcuts% <file:%MyNetworkShortcuts%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Network Shortcuts\>)
    %MyPrinterShortcuts% <file:%MyPrinterShortcuts%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Printer Shortcuts\>)
    %MyRecent% <file:%MyRecent%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Recent\>)
    %MySendTo% <file:%MySendTo%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\SendTo\>)
    %MyStartMenu% <file:%MyStartMenu%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Start Menu\>)
    %MyPrograms% <file:%MyPrograms%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\>)
    %MyAdminTools% <file:%MyAdminTools%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools\>)
    %MyStartUp% <file:%MyStartUp%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\>)
    %MyTemplates% <file:%MyTemplates%\> (<file:C:\Users\%Benutzername%\AppData\Roaming\Microsoft\Windows\Templates\>)
    %MyDesktop% <file:%MyDesktop%\> (<file:C:\Users\%Benutzername%\Desktop\>)
    %MyDocuments% <file:%MyDocuments%\> (<file:C:\Users\%Benutzername%\Documents\>)
    %MyFavorites% <file:%MyFavorites%\> (<file:C:\Users\%Benutzername%\Favorites\>)
    %MyMusic% <file:%MyMusic%\> (<file:C:\Users\%Benutzername%\Music\>)
    %MyPictures% <file:%MyPictures%\> (<file:C:\Users\%Benutzername%\Pictures\>)
    %MyVideos% <file:%MyVideos%\> (<file:C:\Users\%Benutzername%\Videos\>)

    Gemeinsame Ordner

    Platzhalter Aufruf Ziel

    %CommonDesktop% <file:%CommonDesktop%\> (<file:C:\Users\Public\Desktop\>)
    %CommonDocuments% <file:%CommonDocuments%\> (<file:C:\Users\Public\Documents\>)
    %CommonMusic% <file:%CommonMusic%\> (<file:C:\Users\Public\Music\>)
    %CommonPictures% <file:%CommonPictures%\> (<file:C:\Users\Public\Pictures\>)
    %CommonVideos% <file:%CommonVideos%\> (<file:C:\Users\Public\Videos\>)

    System-Ordner

    Platzhalter Aufruf Ziel

    %WinDir% <file:%WinDir%\> (<file:C:\Windows\>)
    %FontsDir% <file:%FontsDir%\> (<file:C:\Windows\Fonts\>)
    %Resources% <file:%Resources%\> (<file:C:\Windows\Resources\>)
    %SystemDir% <file:%SystemDir%\> (<file:C:\Windows\System32\>)
    %SystemDir64% <file:%SystemDir64%\> (<file:C:\Windows\SysWOW64\>)





    Allerdings ist mir auch nicht klar, warum bei Dir das Directory.exists in einen Fehler läuft.

    @Haudruferzappeltnoch meinte wohl, dass Du einfach mal einen Befehl wie folgenden testen könntest.

    VB.NET-Quellcode

    1. dim test_Bool as boolean = false
    2. try
    3. test = io.path.directory.exists("C:\Users\Fox\Pictures")
    4. debug.print "1. Test: " & test
    5. Catch ex As System.Exception
    6. Debug.print ("1. Test: " & ex.message)
    7. End Try
    8. try
    9. test = io.path.directory.exists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))
    10. debug.print "2. Test: " & test
    11. Catch ex As System.Exception
    12. Debug.print ("2. Test: " & ex.message)
    13. End Try

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Dideldum“ ()

    @Dideldum
    Moin moin

    Test ergibt in beiden Fällen ein "True" :thumbup:

    VB.NET-Quellcode

    1. Dim chkDir As Boolean = False
    2. Dim chkDir2 As Boolean = False
    3. Try
    4. chkDir = IO.Directory.Exists("C:\Users\Fox\Pictures")
    5. chkDir2 = IO.Directory.Exists("C:\Users\Public\Pictures")
    6. Debug.Print($"Test 1: {chkDir} - {chkDir2}")
    7. Catch ex As System.Exception
    8. Debug.Print($"1. Test: {ex.Message}")
    9. End Try
    10. Try
    11. chkDir = IO.Directory.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))
    12. chkDir2 = IO.Directory.Exists(System.Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures))
    13. Debug.Print($"Test 2: {chkDir} - {chkDir2}")
    14. Catch ex As System.Exception
    15. Debug.Print($"2. Test: {ex.Message}")
    16. End Try
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie,

    hallöchen.

    Wo bricht denn in Deinem obigen Script die Einzelschrittverfolgung ab und läuft dann in Zeile 84 in den Error?

    P.S. eine vielleicht nützliche Ergänzung zu Deinem Programm:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function BytesToMBGBTB(bytes As Long) As String
    2. Dim vl As String
    3. Dim length As Long = bytes
    4. If length < 1024 Then
    5. vl = length.ToString & " Bytes"
    6. ElseIf length < 1024 * 1024 Then
    7. vl = Math.Round(length / 1024, 3).ToString & " KB"
    8. ElseIf length < CLng(1024) * 1024 * 1024 Then
    9. vl = Math.Round(length / 1024 / 1024, 3).ToString & " MB"
    10. ElseIf length < CLng(1024) * 1024 * 1024 * 1024 Then
    11. vl = Math.Round(length / 1024 / 1024 / 1024, 3).ToString & " GB"
    12. Else
    13. vl = Math.Round(length / 1024 / 1024 / 1024 / 1024, 3).ToString & " TB"
    14. End If
    15. Return vl
    16. End Function
    @Dideldum
    Abbruch, naja wenn er eins von diesen Verzeichnissen lesne soll.

    Irgendwie nervt mich dieses Windows grad wieder, weil nichts konsequent gemacht ist. :cursing:
    Ich bekommt das nicht in den Kopf, warum ich die Verzeichnisse kopieren darf aber dessen Größe ermitteln wird mir verweigert.
    Das ist doch unsinnig! ?(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    [off topic]

    Amelie schrieb:

    Also im Explorer sehe ich:
    Im Code verwende ich:

    VB.NET-Quellcode

    1. Public Property CurrentUserPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))


    Dabei bekomme ich unter anderem diesen Fehler geworfen.
    Fehler beim Ermitteln der Größe des Verzeichnisses C:\Users\Fox\Documents\Eigene Bilder: Der Zugriff auf den Pfad "C:\Users\Fox\Documents\Eigene Bilder" wurde verweigert.


    Das kann doch gar nicht sein, das sind zwei unterschiedliche Pfade, den Path.Combine kombiniert nichts ! :rolleyes:

    Environment.SpecialFolder.MyPictures ist das Enum das zum ziel führt !
    @FormFollowsFunction Ich würde nicht sagen, dass das off topic, ist. Wir kommen hier ja keinen Schritt weiter. Dein Punkt bestätigt auch wieder meine Vermutung, dass immer noch keine korrekte Fehlerbeschreibung vorliegt.

    Amelie schrieb:

    Irgendwie nervt mich dieses Windows grad wieder, weil nichts konsequent gemacht ist.
    Ich denke nicht, dass es an Windows liegt. Nu hör doch mal auf die Leuts und such eine einzige bestimmte Datei raus, die nicht tut. Isoliert ausprobieren, die Length zu lesen. Dann probieren ob kopieren mit der Datei geht.
    Du hast da eine Schleife laufen und für mich siehts bisher so aus als würde ein Teil funktionieren und ein Teil nicht. Da ist doch klar, dass man die fehlerhaften Elemente erstmal identifizieren muss. Man hat das Gefühl, du hast dein Problem noch nichtmal angefangen zu debuggen. (Und wir sind im Thema schon auf 2 Seiten am Ursachen diskutieren.)
    Hi @Amelie
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))
    Path.Combine verbindet Pfad-Teilstring1 mit Pfad-Teilstring2
    Du hast aber nur einen String im Combine.
    Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    Das Ergebnis ist "C:\Users\%Benutzername%".

    Zum Combine fehlt ein zweiter Kommagetrennter Parameter wie z.B. "Pictures"
    Das würde dann so formuliert:
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),"Pictures")
    (Dieser Pfad lässt sich nur auflösen, wenn tatsächlich ein Ordner "C:\Users\%Benutzername%\Pictures" existiert. Also ganz unabhängig von dem in den "Bilder"-Eigenschaften eingetragenen Verzeichnis).

    (Der SpecialFolder "MyPictures"
    System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
    verlinkt IMMER auf den Pfad, der in einem Windows-System dem System-Ordner "Bilder" zugewiesen ist, selbst dann, wenn der User den Ordnerpfad über die Eigenschaften dem System-Link zu "Bilder" einen anderen Pfad zuweist)
    Also gibt der Inhalt des SpecialFolders "MyPictures" tatsächlich den Pfad zurück, der in den Eigenschaften von "Bilder" (das ist ja nur ein System-Link) im Pfad drin steht.

    Die beiden Ergebnis-Strings
    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),"Pictures")
    und System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
    können also - wenn der User in seinen "Bilder"-Eigenschaften den Pfad z.B. auf den Pfad "D:\Eigene Bilder" auf seiner Datenplatte umgelenkt hat, zwei grundverschiedene Ergebnisse liefern.

    Wo bricht denn Deine Schleife ab, wenn Du einen Haltepunkt auf Deine Zeile 40 setzt und solange wiederholt "F11" drückst, bis die Schleife in den Error läuft?
    Welche Inhalte hatten vor dem Coitus die Variablen?
    Bilder
    • 2024-05-21 23-31-45.jpg

      84,94 kB, 379×499, 230 mal angesehen

    Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von „Dideldum“ ()

    @Haudruferzappeltnoch

    Der Ablauf, läuft in die Exception wenn der Code z.B. hier auftrifft:
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

    Der Grund ist wohl, das man auf die Unter-Verzeichnisse "Eigene Bilder, Eigene Musik, Eigene Videos" so keinen Zugriff hat, weil diese Verzeichnisse da irgendwie "verknüpft" sind?
    Ich weiß das nicht, wie man das nennt. Siehe Bildanhang

    Wenn ich eine bestimmte Datei in einem der Ordner im Userverzeichnis ablege, wo ich Zugriff habe, kann ich die auch lesen!

    VB.NET-Quellcode

    1. ...
    2. Catch ex As UnauthorizedAccessException
    3. ' Zugriff verweigert, Verzeichnis überspringen
    4. Debug.WriteLine($"Zugriff verweigert:{NewCrlLf}{ex.Message}")
    5. ...

    Da bekomme ich dann folgendes:
    Zugriff auf Verzeichnis C:\Users\Fox\Documents\Eigene Bilder verweigert:


    Ich muss dann wohl systematisch diese Zugriffsverweigeungen abfangen und "Ignorieren"?

    Und nochmal zur Erklärung:

    Ich habe im Benutzerverzeichnis die Verzeichnisse:
    "Eigene Bilder" "Eigene Musik" "Eigene Videos" und "Eigene Dokumente" und "Eigene Dateien"

    In dem Verzeichnis "Eigene Dokumente" habe ich wieder "Eigene Bilder" usw...

    Warum doppelt? Warum kann ich da nicht drauf zugreifen?
    Auch auf das Verzeichnis "Eigene Dateien" und einige andere, kann ich nicht zugreifen! Gerade so ein Verzeichnis wie "AppData" wo ja eigentlich wichtige Dateien liegen.

    Das ist für mich verwirrend!



    Fazit für mich:
    Es ist wohl so ohne weiteres nicht möglich " MEIN BENUTZERKONTO " mal eben zu sichern ODER eben nur das was Windows zulässt, auch wenn dann Teile von den Daten fehlen ?(
    Bilder
    • shoot1.jpg

      119,86 kB, 672×250, 24 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    C:\Users\Fox\Documents\Eigene Bilder

    Amelie schrieb:

    Der Ablauf, läuft in die Exception wenn der Code z.B. hier auftrifft:
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    Die Pfade stimmen doch nicht überein. Wenn der Fehler bei Environment.SpecialFolder.MyDocuments kommt, dann sollte doch "C:\Users\Fox\Documents" rauskommen, oder nicht?
    Hallo at all ;)

    Habe mal komplett neu angefangen und mein Test-Code hier als zip angegangen. (ohne obj etc..)
    Zum testen alles in der FormClass.
    Dateien
    • TestCopy.zip

      (21,54 kB, 27 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hi @Amelie

    die im Win-Explorer angezeigten Ordner "Eigene Bilder", "Eigene Videos", "Eigene Dokumente" usw. in Deinem Benutzerverzeichnis sind Verknüpfungen wie die auf dem Desktop.

    Diese System-Verknüpfungen im UserOrdner können ebenso beliebige Namen haben und beinhalten wie die Verknüpfungen auf den Desktop einen verlinkten Pfad, welchen Du mit den SpecialFolders abrufen kannst.
    Diese System-Verknüpfungen ersetzen in der Win-Explorer-Anzeige den eigentlichen Ordnernamen, welcher in diesen System-Verknüpfungen im Pfad eingetragen ist.

    Doppelklickst Du also in Win-Explorer die System-Verknüpfung "Meine Bilder" in Deinem Benutzer-Verzeichnis, öffnet der Win-Explorer den Pfad, welcher in dieser Verknüpfung als Pfad eingetragen ist, zeigt aber in seiner Adressleiste den Namen und nicht den Pfad der Verknüpfung an.
    So zeigt der Win-Explorer per Default z.B. beim Doppelklick auf "Eigene Bilder" in seiner Adressleiste "> Fox > Bilder" und nicht den tatsächlichen Pfad "C:\Users\Fox\Pictures".

    Diesen tatsächlichen Pfad kannst Du aber auslesen, wenn Du:
    1. Mit der linken Maustaste in die Adresszeile des Windows-Explorer klickst
    2. Die System-Verknüpfung mit der rechten Maus anklickst und den Popup-Menupunkt "Eigenschaften" anklickst. Im Tab "Pfad" findest Du den tatsächlichen Pfadnamen.

    An die tatsächlichen Pfadnamen dieser System-Ordner kommst Du also nur unter Nutzung der SpecialFolders, welche eben den Pfad auslesen, welcher in der Verknüpfung steckt.

    Der Sinn dahinter:
    Verknüpfungen kann man kann beliebig umbenennen, ohne die Funktion der Verknüpfung (den darin versteckten Pfad aufzurufen) zu beeinträchtigen.
    Auch haben diese Verknüpfungen in jedem Land andere Namen - hier "Eigene Bilder", im englischsprachigen Raum "My Pictures" usw.

    Daher haben die Variablen in den SpecialFolders auch andere "universale" Aufrufnamen, welche den angesprochenen Ordner-String zurück geben.
    Im Fall "Eigene Bilder" ist dies eben "myPictures"

    Beim Aufruf von
    System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures
    geht das System also her und greift auf den Pfad zu, der in der System-Verknüpfung drin steckt, welche hier den Namen "Eigene Bilder" trägt.
    Dies egal, welchen Namen die Verknüpfung trägt, denn SpecialFolders greift sich den Pfad aus der System-Verknüpfung, die für die "Eigene Bilder" steht.
    Hier ist also nicht Nonmen est Omen, sondern System-Verknüpfungen es omen. :D

    Die Liste von Aufrufnamen und Pfade dieser SpecialFolders habe ich ja oben schon gepostet.
    Hi @Amelie
    Im Ordner "C:\Users\%Benutzername%" sind natürlich viele Dateien und Ordner, auf welche der User (auch, wenn dieser als Administrator angemeldet ist) keinen Zugriff hat.
    Aber alle der folgenden Ordner sind für den User (soweit ich weiss - habe es noch nicht einzeln getestet) zugänglich - und diese kannst Du auch sichern:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim myAdminTools As String = System.Environment.GetFolderPath(Environment.SpecialFolder.AdminTools)
    2. Dim myAppData As String = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    3. Dim myCDBurning As String = System.Environment.GetFolderPath(Environment.SpecialFolder.CDBurning)
    4. Dim myComputer As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyComputer) ' leerer String
    5. Dim myCookiesDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies)
    6. Dim myDesktop As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    7. Dim MyDesktopDir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) ' Doppelt = Desktop
    8. Dim myDocuments As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    9. Dim myDownloads As String = IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads")
    10. Dim myFavorites As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
    11. Dim myHistory As String = System.Environment.GetFolderPath(Environment.SpecialFolder.History)
    12. Dim myInternetCache As String = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)
    13. Dim myLocalAppData As String = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
    14. Dim myMusic As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
    15. Dim myNetworkShortcuts As String = System.Environment.GetFolderPath(Environment.SpecialFolder.NetworkShortcuts)
    16. Dim myPictures As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
    17. Dim myPrinterShortcuts As String = System.Environment.GetFolderPath(Environment.SpecialFolder.PrinterShortcuts)
    18. Dim myPrograms As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Programs)
    19. Dim myRecent As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Recent)
    20. Dim mySendTo As String = System.Environment.GetFolderPath(Environment.SpecialFolder.SendTo)
    21. Dim myStartmenu As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
    22. Dim myStartup As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Startup)
    23. Dim myTemplates As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Templates)
    24. Dim myUserProfile As String = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    25. Dim myVideos As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyVideos)


    Wenn Du versuchst, den gesamten User-Ordner zu sichern, laufen einige Fehler aufgrund nicht zugreifbarer Ordner/Dateien auf.
    Diese sind aber für ein Backup auch rel. uninteressant.

    Neu

    Moin moin

    So habe meine Klasse für das durchsuchen nun fertig.
    Einmal gemacht für meine Freundin, die hat einen Laptop mit nur einer SSD und einer Partition. Also ein "Standart-Windows 10". ;)

    Einmal für mich selbst, wo ich zusätzlich eine weitere HDD habe wo meine Daten liegen. :)

    Spoiler anzeigen

    Aufruf der Class:

    VB.NET-Quellcode

    1. ' Für das User-Directory
    2. CalcSourceSize.StartSearch()
    3. CalcSourceSize.AnalyzeDirectories(EnvAeraInstance.CurrentUserPath)
    4. ' Für eine Festpaltte fals vorhanden
    5. CalcSourceSize.StartSearch()
    6. CalcSourceSize.AnalyzeDirectories(EnvAeraInstance.SourceDrive)


    VB.NET-Quellcode

    1. Public Class DirectoryAnalyzer
    2. ' Eine private, statische Instanz der Klasse, um das Singleton-Muster zu implementieren
    3. Private Shared ReadOnly _instance As New DirectoryAnalyzer()
    4. ' Öffentliche Eigenschaft zum Zugriff auf die Singleton-Instanz
    5. Public Shared ReadOnly Property Instance As DirectoryAnalyzer
    6. Get
    7. Return _instance
    8. End Get
    9. End Property
    10. ' Klasse für den Zugriff auf die Umgebungsinformationen
    11. Private ReadOnly EnvAeraInstance As EnvironmentAera = EnvironmentAera.Instance
    12. ' Instanz des Suchberichts
    13. Private ReadOnly Reporter As ReporterAnalyse = ReporterAnalyse.Instance
    14. ' Instanz der HelperTools
    15. Private ReadOnly Helpertools As FileHelpers = FileHelpers.Instance
    16. ' Aktuelles Verzeichnis
    17. Private Property CurrentDirectory As DirectoryInfo
    18. ' Liste der Dateien
    19. Private ReadOnly FileList As New List(Of String)()
    20. ' Zähler für Ordner, Dateien und Gesamtgröße
    21. Public Property DirectoryCount As Integer = 0
    22. Public Property FileCount As Integer = 0
    23. Public Property TotalBytes As Long = 0
    24. ' Setzen der Startzeit
    25. Public Property StartTime As DateTime = DateTime.Now
    26. ' Flag um den Report anzuzeigen
    27. Public Property ShowReport As Boolean = False
    28. ' Flags für den Abbruch der Analyse
    29. Public Property CancelAnalyse As Boolean = False
    30. Private CancelFlag As Integer = 0
    31. ' Event für die GUI
    32. Public Event CurrentTotalbytes(totalsize As Long)
    33. ''' <summary>
    34. ''' Schreibt die Startzeit des Suchprozesses in den Bericht.
    35. ''' </summary>
    36. Public Sub StartSearch()
    37. Reporter.DeleteReportfile()
    38. StartTime = DateTime.Now
    39. Reporter.WriteToLogFile($"Suche gestartet: {StartTime}")
    40. End Sub
    41. ''' <summary>
    42. ''' Schreibt die Stopzeit und die Dauer des Suchprozesses in den Bericht.
    43. ''' </summary>
    44. Public Sub StopSearch()
    45. Dim stopTime As DateTime = DateTime.Now
    46. Dim elapsedTime As TimeSpan = stopTime - StartTime
    47. Dim formattedElapsedTime As String = elapsedTime.ToString("hh\:mm\:ss")
    48. Reporter.WriteToLogFile($"Suche beendet: {stopTime}{Environment.NewLine}Suchdauer: {formattedElapsedTime}{Environment.NewLine}")
    49. End Sub
    50. ''' <summary>
    51. ''' Setzt die Zähler zurück und löscht den vorherigen Suchbericht.
    52. ''' </summary>
    53. Public Sub ResetValues()
    54. FileList.Clear()
    55. DirectoryCount = 0
    56. FileCount = 0
    57. TotalBytes = 0
    58. End Sub
    59. ''' <summary>
    60. ''' Schreibt die Analyseergebnisse in den Suchbericht.
    61. ''' </summary>
    62. Private Sub WriteResultsToReport()
    63. RaiseEvent CurrentTotalbytes(TotalBytes)
    64. Dim readableSize As String = Helpertools.ConvertBytesToReadableSize(TotalBytes)
    65. Reporter.WriteToLogFile($"Gesamtgröße: {readableSize}")
    66. Reporter.WriteToLogFile($"Anzahl Verzeichnisse: {DirectoryCount}")
    67. Reporter.WriteToLogFile($"Anzahl Dateien: {FileCount}")
    68. End Sub
    69. ''' <summary>
    70. ''' Analysiert die Verzeichnisse eines Laufwerks und zählt Ordner, Dateien und deren Größe,
    71. ''' und listet diese in der Reporter-Datei auf.
    72. ''' </summary>
    73. Public Sub AnalyzeDirectories(searchDrive As String)
    74. ' Zurücksetzen der Werte
    75. ResetValues()
    76. StartSearch()
    77. ' Stack für die Verzeichnisse, die durchlaufen werden sollen
    78. Dim directories As New Stack(Of DirectoryInfo)()
    79. directories.Push(New DirectoryInfo(searchDrive))
    80. ' Durchlaufen des Laufwerks und Zählen der Ordner, Dateien und Bytes
    81. Dim isFirstDirectory As Boolean = True
    82. While directories.Count > 0
    83. ' Abbrechen der Analyse
    84. If CancelAnalyse Then
    85. SendCancelMessage()
    86. Exit While
    87. End If
    88. CurrentDirectory = directories.Pop()
    89. If isFirstDirectory Then
    90. Reporter.WriteToLogFile($"Stammverzeichnis: [{CurrentDirectory.FullName}]{Environment.NewLine}")
    91. isFirstDirectory = False
    92. Else
    93. Reporter.WriteToLogFile($"Verzeichnis: {CurrentDirectory.FullName}")
    94. DirectoryCount += 1
    95. End If
    96. ProcessDirectory(CurrentDirectory, directories)
    97. End While
    98. ' Ergebnisse in den Suchbericht schreiben
    99. WriteResultsToReport()
    100. StopSearch()
    101. ShowReportDialog()
    102. End Sub
    103. ''' <summary>
    104. ''' Verarbeitet ein einzelnes Verzeichnis und fügt seine Unterverzeichnisse zum Stack hinzu.
    105. ''' </summary>
    106. Private Sub ProcessDirectory(directory As DirectoryInfo, directories As Stack(Of DirectoryInfo))
    107. ' Abbrechen der Analyse
    108. If CancelAnalyse Then
    109. SendCancelMessage()
    110. Exit Sub
    111. End If
    112. Try
    113. ' Dateien im aktuellen Verzeichnis zählen und ihre Größe summieren
    114. For Each file As FileInfo In directory.GetFiles()
    115. If IsValidFile(file) Then
    116. ProcessFile(file)
    117. End If
    118. Next
    119. ' Unterverzeichnisse in den Stack hinzufügen
    120. For Each subDir As DirectoryInfo In directory.GetDirectories()
    121. If IsValidDirectory(subDir) Then
    122. directories.Push(subDir)
    123. End If
    124. Next
    125. Catch ex As Exception
    126. HandleException(ex, directory.FullName)
    127. End Try
    128. End Sub
    129. ''' <summary>
    130. ''' Nur einen Eintrag in den Reporter schreiben
    131. ''' </summary>
    132. Private Sub SendCancelMessage()
    133. If CancelFlag < 1 Then
    134. Debug.WriteLine($"Analyse abgebrochen")
    135. Reporter.WriteToLogFile($"Analyse durch Benutzer abgebrochen!")
    136. CancelFlag += 1
    137. End If
    138. End Sub
    139. ''' <summary>
    140. ''' Überprüft, ob die Datei gültig ist (nicht versteckt und kein Systemattribut).
    141. ''' </summary>
    142. Private Function IsValidFile(file As FileInfo) As Boolean
    143. Return (file.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden AndAlso (file.Attributes And FileAttributes.System) <> FileAttributes.System
    144. End Function
    145. ''' <summary>
    146. ''' Verarbeitet eine einzelne Datei, indem sie gezählt und ihre Größe summiert wird,
    147. ''' und in der Reporter-Datei aufgelistet wird.
    148. ''' </summary>
    149. Private Sub ProcessFile(file As FileInfo)
    150. Try
    151. FileCount += 1
    152. TotalBytes += file.Length
    153. 'Debug.WriteLine($"Datei: {file.FullName}")
    154. Reporter.WriteToLogFile($" Datei: {file.FullName}")
    155. Catch ex As Exception
    156. HandleException(ex, file.FullName)
    157. End Try
    158. End Sub
    159. ''' <summary>
    160. ''' Überprüft, ob das Verzeichnis gültig ist (nicht versteckt und kein Systemattribut).
    161. ''' </summary>
    162. Private Function IsValidDirectory(directory As DirectoryInfo) As Boolean
    163. Return (directory.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden AndAlso (directory.Attributes And FileAttributes.System) <> FileAttributes.System
    164. End Function
    165. ''' <summary>
    166. ''' Behandelt Ausnahmen und schreibt die Fehlermeldung in das Debug-Protokoll.
    167. ''' </summary>
    168. Private Sub HandleException(ex As Exception, path As String)
    169. Debug.WriteLine($"Fehler bei {path}:{Environment.NewLine}{ex.Message}")
    170. End Sub
    171. ''' <summary>
    172. ''' Behandelt die Messagebox für den Analyse-Report.
    173. ''' </summary>
    174. Private Sub ShowReportDialog()
    175. If ShowReport Then
    176. ' Dialog anzeigen, um den Benutzer zu fragen, ob der Report aufgerufen werden soll
    177. Dim result As DialogResult = MessageBox.Show("Möchten Sie den Analyse-Report aufrufen?", "Analyse-Report", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    178. If result = DialogResult.Yes Then
    179. OpenReport()
    180. End If
    181. End If
    182. End Sub
    183. ''' <summary>
    184. ''' Öffnet die Textdatei mit dem Analyse-Protokoll.
    185. ''' </summary>
    186. Private Sub OpenReport()
    187. ' Bestimmen des Dateipfads
    188. Dim logFilePath As String = Path.Combine(EnvAeraInstance.AppDataPath, "AnalyseReporter.txt")
    189. ' Öffnen der Event-Log-Datei mit dem Standardprogramm
    190. System.Diagnostics.Process.Start(logFilePath)
    191. End Sub
    192. End Class


    Auszug aus dem Reporter:

    XML-Quellcode

    1. Suche gestartet: 06.06.2024 19:30:04
    2. Stammverzeichnis: [D:\]
    3. Verzeichnis: D:\Dakota
    4. Datei: D:\Dakota\0008-13_1200.jpg
    5. Datei: D:\Dakota\0012-01_1200.jpg
    6. Datei: D:\Dakota\0012-19_1200.jpg
    7. Datei: D:\Dakota\0012-20_1200.jpg
    8. Verzeichnis: D:\CCacert
    9. Datei: D:\CCacert\750_0016.zip
    10. Verzeichnis: D:\CCacert\Bücher
    11. .......
    12. ....
    13. .

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: