Wie kann ich die Größe eines Ordners oder einer Datei in Java abrufen?
java
filesystems
oneat
quelle
quelle
StatFs
. Es verwendet Dateisystemstatistiken und ist fast 1000-mal schneller als rekursive Methoden, die für unsere Anforderungen unbrauchbar waren. Unsere Implementierung finden Sie hier: stackoverflow.com/a/58418639/293280Antworten:
Dies gibt die Länge der Datei in Bytes zurück oder
0
wenn die Datei nicht existiert. Es gibt keine integrierte Methode, um die Größe eines Ordners zu ermitteln. Sie müssen den Verzeichnisbaum rekursiv durchsuchen (mithilfe derlistFiles()
Methode eines Dateiobjekts, das ein Verzeichnis darstellt) und die Verzeichnisgröße selbst akkumulieren:WARNUNG : Diese Methode ist für den Einsatz in der Produktion nicht robust genug.
directory.listFiles()
kann zurückkehrennull
und a verursachenNullPointerException
. Außerdem werden Symlinks nicht berücksichtigt und es gibt möglicherweise andere Fehlermodi. Verwenden Sie diese Methode .quelle
NullPointerException
wenn das Verzeichnis gleichzeitig geändert wird.Mit Java-7 nio api kann die Ordnergröße viel schneller berechnet werden.
Hier ist ein sofort einsatzbereites Beispiel, das robust ist und keine Ausnahme auslöst. Es werden Verzeichnisse protokolliert, in die es nicht eintreten kann oder die Probleme beim Durchlaufen hatten. Symlinks werden ignoriert und die gleichzeitige Änderung des Verzeichnisses verursacht nicht mehr Probleme als nötig.
quelle
AtomicLong
statt nurlong
?Files
es nicht direkt unterstützt wird!Sie benötigen
FileUtils#sizeOfDirectory(File)
von Commons-Io .Beachten Sie, dass Sie manuell überprüfen müssen, ob die Datei ein Verzeichnis ist, da die Methode eine Ausnahme auslöst, wenn ein Nichtverzeichnis an sie übergeben wird.
WARNUNG : Diese Methode (ab Commons-Io 2.4) hat einen Fehler und kann ausgelöst werden,
IllegalArgumentException
wenn das Verzeichnis gleichzeitig geändert wird.quelle
checkDirectory(directory);
Prüfung ein. Stellen Sie einfach sicher, dassFile.listFiles
Kinder haben. Refs: FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
wenn das Verzeichnis während der Iteration geändert wird.In Java 8:
Es wäre schöner,
Files::size
im Kartenschritt zu verwenden, aber es wird eine aktivierte Ausnahme ausgelöst.UPDATE:
Sie sollten sich auch bewusst sein, dass dies eine Ausnahme auslösen kann, wenn auf einige der Dateien / Ordner nicht zugegriffen werden kann. Siehe diese Frage und eine andere Lösung mit Guava .
quelle
quelle
size += getFolderSize(file);
Für Java 8 ist dies ein richtiger Weg:
Es ist wichtig, alle Verzeichnisse herauszufiltern , da die Längenmethode für Verzeichnisse nicht garantiert 0 ist.
Zumindest liefert dieser Code die gleichen Größeninformationen wie der Windows Explorer.
quelle
Hier ist der beste Weg, um die Größe einer allgemeinen Datei zu ermitteln (funktioniert für Verzeichnisse und Nichtverzeichnisse):
Bearbeiten: Beachten Sie, dass dies wahrscheinlich ein zeitaufwändiger Vorgang sein wird. Führen Sie es nicht im UI-Thread aus.
Auch hier (entnommen aus https://stackoverflow.com/a/5599842/1696171 ) ist eine gute Möglichkeit, einen benutzerlesbaren String aus dem lange zurückgegebenen zu erhalten:
quelle
Wenn Sie die Java 8 NIO- API verwenden möchten, druckt das folgende Programm die Größe des Verzeichnisses in Byte, in dem es sich befindet.
Die
calculateSize
Methode ist universell fürPath
Objekte und funktioniert daher auch für Dateien. Beachten Sie, dass in diesem Fall die zurückgegebene Größe des Pfadobjekts lautet, wenn auf eine Datei oder ein Verzeichnis nicht zugegriffen werden kann0
.quelle
File.length()
( Javadoc ).Beachten Sie, dass dies für Verzeichnisse nicht funktioniert oder nicht garantiert funktioniert.
Was möchten Sie für ein Verzeichnis? Wenn es sich um die Gesamtgröße aller darunter liegenden Dateien handelt, können Sie Kinder mit
File.list()
und rekursiv spazieren gehenFile.isDirectory()
und ihre Größe summieren.quelle
Das
File
Objekt hat einelength
Methode:quelle
Quellcode:
quelle
Für Windows ist diese rekursive Funktion mit java.io nützlich.
Dies ist getestet und funktioniert an meinem Ende richtig.
quelle
Ich habe getestet
du -c <folderpath>
und ist 2x schneller als nio.Files oder Rekursionquelle
quelle
Nach vielen Recherchen und Untersuchungen zu verschiedenen Lösungen, die hier bei StackOverflow vorgeschlagen wurden. Ich beschloss schließlich, meine eigene Lösung zu schreiben. Mein Zweck ist ein No-Throw-Mechanismus, da ich nicht abstürzen möchte, wenn die API die Ordnergröße nicht abrufen kann. Diese Methode ist nicht für Multithread-Szenarien geeignet.
Zunächst möchte ich beim Durchlaufen des Dateisystembaums nach gültigen Verzeichnissen suchen.
Zweitens möchte ich nicht, dass mein rekursiver Aufruf in Symlinks (Softlinks) übergeht und die Größe in das Gesamtaggregat einbezieht.
Schließlich meine rekursionsbasierte Implementierung, um die Größe des angegebenen Verzeichnisses abzurufen. Beachten Sie die Nullprüfung für dir.listFiles (). Laut javadoc besteht die Möglichkeit, dass diese Methode null zurückgibt.
Etwas Sahne auf dem Kuchen, die API, um die Größe der Liste Dateien zu erhalten (möglicherweise alle Dateien und Ordner unter root).
quelle
unter linux wenn du verzeichnisse sortieren willst dann du -hs * | sort -h
quelle
Sie können verwenden
Apache Commons IO
, um die Ordnergröße leicht zu finden.Wenn Sie auf Maven sind, fügen Sie bitte die folgende Abhängigkeit in Ihre
pom.xml
Datei ein.Wenn Sie kein Fan von Maven sind, laden Sie das folgende Glas herunter und fügen Sie es dem Klassenpfad hinzu.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Um die Dateigröße über Commons IO zu erhalten,
Es ist auch über erreichbar
Google Guava
Fügen Sie für Maven Folgendes hinzu:
Wenn Sie Maven nicht verwenden, fügen Sie dem Klassenpfad Folgendes hinzu
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Um die Dateigröße zu erhalten,
quelle
quelle