Verzeichnisgröße berechnen

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

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Verzeichnisgröße berechnen

    Hallo

    Mit folgender Funktion möchte ich die Größe aller Dateien in den Verzeichnissen / Unterverzeichnisse berechnen.
    Warum bekomme ich dabei haufenweise Fehler, das der Zugriff verweigert wird.
    Zum Beispiel auf meine ganzen "Userverzeichnisse", wie Bilder,Videos usw...

    Ich kann die ohne Fehler kopieren aber die Größe ermitteln nicht??


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SizeCalculator
    2. ' Methode zum Ermitteln der Größe aller Dateien in einem Verzeichnis und seinen Unterverzeichnissen
    3. Public Async Function GetTotalSizeAsync(ByVal path As String) As Task(Of Long)
    4. Return Await Task.Run(Function() GetTotalSize(path))
    5. End Function
    6. Private Function GetTotalSize(ByVal path As String) As Long
    7. Dim totalSize As Long = 0
    8. Try
    9. ' Überprüfen, ob der Pfad existiert
    10. If Directory.Exists(path) Then
    11. ' Dateien im aktuellen Verzeichnis durchlaufen
    12. For Each file As String In Directory.GetFiles(path)
    13. totalSize += New FileInfo(file).Length
    14. Next
    15. ' Unterverzeichnisse durchlaufen und rekursiv ihre Größen ermitteln
    16. For Each subDir As String In Directory.GetDirectories(path)
    17. totalSize += GetTotalSize(subDir)
    18. Next
    19. Else
    20. ' Wenn der Pfad nicht existiert, eine Meldung ausgeben oder entsprechend behandeln
    21. Debug.WriteLine($"Der Pfad {path} existiert nicht.")
    22. End If
    23. Catch ex As Exception
    24. ' Fehlerbehandlung, falls beim Durchlaufen der Verzeichnisse ein Fehler auftritt
    25. Debug.WriteLine($"Fehler beim Ermitteln der Größe des Verzeichnisses {path}: {ex.Message}")
    26. End Try
    27. Return totalSize
    28. End Function
    29. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nimm doch mal eine spezifische Datei, bei der es scheitert und pack die woanders hin. Gibts dann auch denselben Fehler?

    Und was für ein Fehler überhaupt? Und in welcher Zeile?

    Außerdem kannst du in GetFiles oder EnumerateFiles Methoden üblicherweise eine SearchOption angegeben, die automatisch Unterverzeichnisse einbezieht.
    Dadurch lässt sich deine ganze GetTotalSize Methode ersetzen durch

    VB.NET-Quellcode

    1. Dim myDir = New DirectoryInfo(path)
    2. Dim TotalSize = myDir.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(Function(f) f.Length)
    @Amelie Gib Deinem Programm Administratorrechte.
    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!
    Der Klassiker beim Arbeiten mit Dateien: UnauthorizedAccessException, auch IO.FileNotFoundException. Ich verstehe Deine Verwunderung nicht. Selbst mit Adminrechten kommt man zu solchen Problemen. Du hast doch zweifellos ganz viele Try-Blöcke in Deinem Backupprogramm, die sich darum kümmern.
    Daher kann ich den Vorschlägen von @Haudruferzappeltnoch & @RodFromGermany nicht zustimmen.

    anderes Thema: Benennung der Klasse: SizeCalculator? Kann der auch meine Körpergröße berechnen? Oder die meiner nächsten Mahlzeit? --> FileSizeCalculator? DirectorySizeCalculator?
    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.
    Dein Vorschlag fängt die ganzen Exceptions nicht ab, die zwangsläufig auftreten. Aber vielleicht bin ich auch betriebsblind und Dein Vorschlag kann irgendwie umgebaut funktionieren. Nach meinen bisherigen Beobachtungen bei diesem Thema sollte man sogar noch spezifischer als der Post#1-Code werden: Bei jeder einzelnen Datei, die angefasst und auf Länge/Größe oder was anderes geprüft wird, muss ein Try-Catch-Block drumrum, um alles auszufiltern, was sich dem Zugriff verweigert. Der Code aus Post#1 ist m.E. da noch zu unspezifisch, weil eine einzelne Datei in einem Verzeichnis das komplette Verzeichnis unzugänglich macht.
    @Amelie: Da fällt grad auf, dass es wohl auch etwas ineffizient ist, mit einem String anzufangen und dann unzählige FileInfo-Objekte zu erstellen. Erstell aus dem Startverzeichnis ein DirectoryInfo-Objekt, dann bekommst Du mit GetDirectories automatisch DirectoryInfo-Objekte und mit GetFiles FileInfo-Objekte.
    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.
    Was will ich da Exceptions abfangen? Es tritt ein Fehler auf, der offenbar nicht auftreten soll (Kopieren klappt ja, laut TE).
    So verstehe ich diesen Thread.

    Wir wissen nicht mal welcher Fehlertyp bisher oder wo der Fehler auftritt. Gut spekulieren wir über UnauthorizedAccessException, habe ich auch implizit getan.
    Jetzt denke ich ohne Leserechte ist Kopieren nicht möglich. Andererseits sollte ein FileInfo wohl mit Leserechten die Größe rauskriegen. Also ein bissle Rumprobieren, zum Beispiel durch Änderung der Rechte entweder über Adminzugang wie RFG sagt, über einen anderen Speicherort oder eine andere Methode hilft womöglich dabei eine aussagekräftigere Fehlerbeschreibung abzugeben.
    Hallo an alle

    Ja ich habe einige Try Blöcke um etwas abzufangen. Und das Programm hat Adminrechte.
    Ich habe erstmal ein Verständnisproblem.

    Warum kann ich das Verzeichnis "C:\User\Username\Pictures" mit all seinen Dateien einfach kopieren ABER bei der Berechnung der Totalen Byte des Ordners und seiner Dateien
    bekomme ich die Exception: "Zugriff verweigert" ?( ?(

    Das ist mir unlogisch :S ?(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Was passiert, wenn Du das ganze synchron machst?

    VB.NET-Quellcode

    1. Public Function GetTotalSize(path As String) As Long
    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!

    Amelie schrieb:

    das Verzeichnis "C:\User\Username\Pictures"
    Muss es nicht "c:\users\username\pictures" heißen?
    Gut du kannst natürlich auch einen "User" Ordner haben, der so aufgebaut ist, aber mein Bilderpfad läuft so

    Ansonsten hast du recht, das ist nicht logisch, aber ohne mehr Infos können wir uns da auch nix bei denken.
    "Zugriff verweigert" ist auch keine Exception sondern irgendein Exceptiontext
    Gib mal dazu folgende Infos:
    1. Kannst Du erfolgreich per Code kopieren oder per Datei-Explorer?
    2. Wieviele Dateien hat der Ordner laut Code, wieviel laut Datei-Explorer?
    3. Kommen alle Dateien, die Du kopierst, im Zielverzeichnis an (s. Frage 2)?
    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.

    Haudruferzappeltnoch schrieb:

    Muss es nicht "c:\users\username\pictures" heißen?
    Nein.
    ====
    Wenn ich den Wert für C:\Users\User\Pictures\ ermittle, funktioniert das problemlos.
    Bei C:\ knallt es beliebig oft.
    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!

    Haudruferzappeltnoch schrieb:

    Wie nein?
    Muss es nicht "users\" heißen?
    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!
    Ich blick nicht mehr, inwieweit Ihr aneinander vorbei schreibt. Die Frage an @Haudruferzappeltnoch an @Amelie war:
    »Muss es nicht "c:\users\username\pictures" heißen?«, weil @Amelie ihren Pfad ohne S am Ende von User angab: C:\User\Username\Picture
    @Haudruferzappeltnoch hat also auf einen möglichen Codefehler hingewiesen. Daher verstehe ich Post#12 nicht. Und die Folgeposts #13 und #14 logischerweise auch nicht.
    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.
    Also im Explorer sehe ich: ​C:\Benutzer\Fox\Eigene Bilder
    Ja mit dem Leerzeichen bei Eigene Bilder. Desweiteren hat das Verzeichnis "Fox" ein kleines Schloss im Symbol.

    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 geht noch eine ganze Weile mit anderen Ordner in meinem Benutzerverzeichnis.

    Wenn die ganzen Fehler abgefangen wurden, läuft das kopieren normal weiter. Unterschied, auf der USB-Platte wird aus "Eigene Bilder" dann "Pictures" usw...

    Bzgl. "Syncron" Dabei friert die GUI ein obwohl das meiste zur Zeit noch über Debugausgaben läuft.

    Gesammtgröße: Im Explorer wird bei den Eigenschaften des Ordner Benutzer angegeben: 1,26GB Das gleiche Ergebnis zeig auch mein Code an.

    Nach dem kopieren auf der externen Platte: Größe im Explorer 935MB
    Hier geht dann einiges "verloren" aus dem Ordner "AppData"
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nur mal so am Rande, die "Ordner" "Eigene Bilder" etc. (die anderen Namen kenne ich nicht, habe keine deutsche Installation) sind in der Standardinstallation keine Ordner sondern Symlinks - das kann zu sehr vielen Problemen führen.