Comment puis-je récupérer la taille du dossier ou du fichier en Java?
java
filesystems
une place
la source
la source
StatFs
. Il utilise les statistiques du système de fichiers et est presque 1000 fois plus rapide que les méthodes récursives, qui étaient inutilisables pour nos besoins. Notre implémentation peut être trouvée ici: stackoverflow.com/a/58418639/293280Réponses:
Cela renvoie la longueur du fichier en octets ou
0
si le fichier n'existe pas. Il n'y a pas de moyen intégré pour obtenir la taille d'un dossier, vous allez devoir parcourir l'arborescence de répertoires de manière récursive (en utilisant lalistFiles()
méthode d'un objet fichier qui représente un répertoire) et accumuler la taille du répertoire pour vous-même:AVERTISSEMENT : cette méthode n'est pas suffisamment robuste pour une utilisation en production.
directory.listFiles()
peut revenirnull
et provoquer unNullPointerException
. De plus, il ne prend pas en compte les liens symboliques et possède éventuellement d'autres modes d'échec. Utilisez cette méthode .la source
NullPointerException
si le répertoire est modifié simultanément.En utilisant java-7 nio api, le calcul de la taille du dossier peut être fait beaucoup plus rapidement.
Voici un exemple prêt à l'emploi qui est robuste et ne lèvera pas d'exception. Il enregistrera les répertoires qu'il ne peut pas entrer ou qu'il a eu du mal à parcourir. Les liens symboliques sont ignorés et la modification simultanée du répertoire ne causera pas plus de problèmes que nécessaire.
la source
AtomicLong
au lieu de simplementlong
?Files
ne pas le supporter directement!Vous avez besoin
FileUtils#sizeOfDirectory(File)
de commons-io .Notez que vous devrez vérifier manuellement si le fichier est un répertoire car la méthode lève une exception si un non-répertoire lui est passé.
AVERTISSEMENT : cette méthode (à partir de commons-io 2.4) a un bogue et peut lancer
IllegalArgumentException
si le répertoire est modifié simultanément.la source
checkDirectory(directory);
vérification. Assurez-vous simplement que celaFile.listFiles
a des enfants. Réf : FileUtils.sizeOfDirectory () , File.listFiles ()IllegalArgumentException
si le répertoire est modifié pendant son itération.Dans Java 8:
Ce serait plus agréable à utiliser
Files::size
dans l'étape de la carte mais cela lève une exception vérifiée.MISE À JOUR:
Vous devez également être conscient que cela peut lever une exception si certains des fichiers / dossiers ne sont pas accessibles. Voir cette question et une autre solution utilisant Guava .
la source
la source
size += getFolderSize(file);
Pour Java 8, c'est une bonne façon de le faire:
Il est important de filtrer tous les répertoires , car la méthode de longueur n'est pas garantie à 0 pour les répertoires.
Au moins, ce code fournit les mêmes informations de taille que l'Explorateur Windows lui-même.
la source
Voici le meilleur moyen d'obtenir la taille générale d'un fichier (fonctionne pour les répertoires et les non-répertoires):
Edit: Notez que cela va probablement être une opération longue. Ne l'exécutez pas sur le thread de l'interface utilisateur.
En outre, ici (extrait de https://stackoverflow.com/a/5599842/1696171 ) est un bon moyen d'obtenir une chaîne lisible par l'utilisateur à partir du long renvoyé:
la source
Si vous souhaitez utiliser l' API Java 8 NIO , le programme suivant imprimera la taille, en octets, du répertoire dans lequel il se trouve.
La
calculateSize
méthode est universelle pour lesPath
objets, elle fonctionne donc également pour les fichiers. Notez que si un fichier ou un répertoire est inaccessible, dans ce cas, la taille renvoyée de l'objet chemin sera0
.la source
File.length()
( Javadoc ).Notez que cela ne fonctionne pas pour les répertoires ou n'est pas garanti.
Pour un annuaire, que voulez-vous? S'il s'agit de la taille totale de tous les fichiers en dessous, vous pouvez parcourir les enfants de manière récursive en utilisant
File.list()
etFile.isDirectory()
et additionner leurs tailles.la source
L'
File
objet a unelength
méthode:la source
Code source:
la source
pour windows, en utilisant java.io cette fonction récursive est utile.
Ceci est testé et fonctionne correctement de mon côté.
la source
J'ai testé
du -c <folderpath>
et est 2x plus rapide que nio.Files ou récursivitéla source
la source
Après de nombreuses recherches et recherches sur les différentes solutions proposées ici chez StackOverflow. J'ai finalement décidé d'écrire ma propre solution. Mon but est d'avoir un mécanisme de non-projection car je ne veux pas planter si l'API est incapable de récupérer la taille du dossier.Cette méthode ne convient pas aux scénarios multithreads.
Tout d'abord, je veux vérifier les répertoires valides tout en parcourant l'arborescence du système de fichiers.
Deuxièmement, je ne veux pas que mon appel récursif entre dans des liens symboliques (liens souples) et inclue la taille dans l'agrégat total.
Enfin, mon implémentation basée sur la récursivité pour récupérer la taille du répertoire spécifié. Notez la vérification nulle pour dir.listFiles (). Selon javadoc, il est possible que cette méthode puisse retourner null.
Un peu de crème sur le gâteau, l'API pour obtenir la taille de la liste des fichiers (peut-être tous les fichiers et dossiers sous la racine).
la source
sous linux si vous voulez trier les répertoires, alors du -hs * | trier -h
la source
Vous pouvez utiliser
Apache Commons IO
pour trouver facilement la taille du dossier.Si vous êtes sur maven, veuillez ajouter la dépendance suivante dans votre
pom.xml
fichier.Si vous n'êtes pas fan de Maven, téléchargez le fichier jar suivant et ajoutez-le au chemin de classe.
https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar
Pour obtenir la taille du fichier via Commons IO,
Il est également réalisable via
Google Guava
Pour Maven, ajoutez ce qui suit:
Si vous n'utilisez pas Maven, ajoutez ce qui suit au chemin de classe
https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar
Pour obtenir la taille du fichier,
la source
la source