Verzeichnisgröße ermitteln

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

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

    Verzeichnisgröße ermitteln

    Hallo Leute,
    kann mir jemand sagen, wie man direkt die Verzeichnisgröße, d.h. den gesamten Inhalt eines Verzeichnisses, ermittelt.
    Durch rekursives ermitteln aller Feiles ist kein Problem, ich brauche den Wert allerdings vorher für den ProgressBar.Maximum-Wert,
    damit ich eine nochfolgende rekursive Suche visualisieren kann.
    Ich dachte, in System.IO.DirectoryInfo... müsste ich etwas finden, oder?
    LG DHB

    *Topic verschoben (war in Tipps&Tricks)*
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    DHB schrieb:

    Durch rekursives ermitteln aller Feiles ist kein Problem

    Anscheinend gibt's keine Alternative, siehe stackoverflow.com/questions/32…-of-a-directory-in-vb-net und stackoverflow.com/questions/28…te-a-windows-folders-size

    Die erste Antwort hier: stackoverflow.com/questions/35…cluding-the-parent-folder zeigt einen kurzen Code dafür:

    VB.NET-Quellcode

    1. Public Function GetDirectorySize(path As String) As Long
    2. Dim files() As String = Directory.GetFiles(path, "*", SearchOption.AllDirectories)
    3. Dim size As Long = 0
    4. For Each file As String In files
    5. Dim info As New FileInfo(file)
    6. size += info.Length
    7. Next
    8. Return size
    9. End Function

    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hey Marcus,
    klappt super!
    Danke :thumbsup:
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    Ich würde keine Progressbar machen die irgendwelche Werte (Zeit, Größe) anzeigt sondern einfach nur das gerade etwas passiert. Der Witz ist, dass ja man vorher schon alle Files durchgehen muss und dann nochmal um diese zu verarbeiten. Kostet nur unnötig Zeit...
    "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
    @mrMo
    grundsätzlich hast Du ja recht, aber in meinem Fall ist es ausdrücklich erwünscht,
    da der von Marcus vorgeschlagene Weg gleichzeitig anderweitig genutzt wird! :thumbup:

    @Marcus Gräfe
    wie ich bereits geposted hatte, "Klappt super!" - so dachte ich.
    Jetzt habe ich allerdings festgestellt, dass Zeile 2 eine Fehlermeldung auslöst,
    wenn eines der Unterverzeichnisse (z.B. "Systeme Volume Information") den
    Zugriff verweigert; wie kann ich speziell diesen Fehler abfangen? ?(
    Die anderen Files (bzw. Directories) sollen dabei aber weiter bearbeitet werden!
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    @DHB Du musst entweder das Verzeichnis fragen, ob Du dessen Rechte hast
    oder
    Du arbeitest mit Zty/Catch und fängst explizit diese Exception ab.
    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!
    @RodFromGermany
    na ja, im
    1. Vorschlag kann ich das Verzeichnis ja nicht explizied ansprechen, zumindest nicht mit
    "Dim files() As String = Directory.GetFiles(path, "*", SearchOption.AllDirectories)"
    und auch beim
    2. Vorschlag wird der Fehler doch durch die "SearchOption.AllDirectories" von
    "Directory.GetFiles" ausgelöst, also werden weder vorher noch hinterher weitere
    Files untersucht, und das brauche ich doch.

    Wenn ich da einen Denkfehler drin habe, sei doch bitte so nett und schreibe,
    WIE ich den Fehler genau abfangen kann!
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.

    DHB schrieb:

    SearchOption.AllDirectories
    Diese Herangehensweise ist falsch.
    Liste zunächst mit Directory.GetDirectories() alle Verzeichnisse auf, die kannst Du dann iterativ mit Directory.GetFiles() durchgehen.
    Wenn Du z.B. in der Root anfängst, bekommst Du System Volume Information gelistet.
    Wenn Du dann separat darauf zugreifst, knallt es nur hier, den Rest kannst Du aufsammeln.
    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!
    @RodFromGermany
    aber das mach ich doch, hier meine (gekürzte) Procedure:

    Public Function GetDirsCount(Path As String) As Long
    Try
    Dim Dirs() As String = Directory.GetDirectories(AktRoot, "*", SearchOption.AllDirectories)
    Dim Anz As Long = Dirs.Count
    For Each Dr As String In Dirs
    Anz += 1 ' Hier irgendwas
    Next
    Return Anz
    Catch ex As Exception
    Return -1
    End Try
    End Function

    der Fehler tritt doch schon in der Zeile "Dim Dirs()…" auf
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    @cf5730
    danke, jetzt hab ich's ! :thumbsup:
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    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!