118 votes

Obtenir la taille d'un dossier ou d'un fichier

Comment puis-je récupérer la taille d'un dossier ou d'un fichier en Java ?

0 votes

Même chose mais en mettant l'accent sur l'efficacité : stackoverflow.com/questions/116574/

0 votes

Si vous êtes sur Android alors jetez un coup d'œil à StatFs . Il utilise les statistiques du système de fichiers et est presque 1000x 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/293280

202voto

Tendayi Mawushe Points 10335
java.io.File file = new java.io.File("myfile.txt");
file.length();

Ceci retourne 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'arbre des répertoires de manière récursive (en utilisant la fonction listFiles() d'un objet fichier qui représente un répertoire) et accumulez la taille du répertoire pour vous-même :

public static long folderSize(File directory) {
    long length = 0;
    for (File file : directory.listFiles()) {
        if (file.isFile())
            length += file.length();
        else
            length += folderSize(file);
    }
    return length;
}

11 votes

Faites attention si vous exécutez cette commande dans le répertoire C : Root d'une machine Windows ; il y a un fichier système qui n'est (selon java.io.File) ni un fichier ni un répertoire. Vous pouvez modifier la clause else pour vérifier que le fichier est bien un répertoire.

2 votes

Un simple changement pour vérifier le paramètre pour voir si ce n'est pas un répertoire au début de la méthode et retourner la longueur alors la récursion est plus simple - il suffit d'ajouter l'appel à self dans la même méthode et puis cela supporte le passage dans une référence de fichier au lieu d'un répertoire ainsi.

3 votes

Si vous utilisez Java 7 ou supérieur, utilisez la réponse stackoverflow.com/a/19877372/40064 c'est beaucoup plus rapide.

47voto

Aksel Willgert Points 3791

En utilisant l'api java-7 nio, le calcul de la taille du dossier peut être effectué beaucoup plus rapidement.

Voici un exemple prêt à l'emploi qui va également sauter et enregistrer les répertoires dans lesquels il ne peut pas entrer. Il utilise java.util.concurrent.atomic.AtomicLong pour accumuler l'état.

public static void main(String[] args) throws IOException {
    long size = getSize("c:/");
    System.out.println("size=" + size);
}

static long getSize(String startPath) throws IOException {
    final AtomicLong size = new AtomicLong(0);
    Path path = Paths.get(startPath);

    Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file,
                BasicFileAttributes attrs) throws IOException {
            size.addAndGet(attrs.size());
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc)
                throws IOException {
            // Skip folders that can't be traversed
            System.out.println("skipped: " + file + "e=" + exc);
            return FileVisitResult.CONTINUE;
        }
    });

    return size.get();
}

0 votes

Existe-t-il un équivalent pour le développement Android ?

0 votes

Y a-t-il une raison d'utiliser AtomicLong au lieu de simplement long ?

1 votes

La variable doit être finale lorsqu'elle est accessible depuis une classe anonyme.

41voto

yegor256 Points 21737

Vous devez FileUtils#sizeOfDirectory(File) de commun-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 fichier non répertoire lui est transmis.

0 votes

Que se passe-t-il lorsque le fichier n'est pas un répertoire ? lorsqu'il n'existe pas ? etc.

0 votes

@Mr_et_Mrs_D - Il suffit de copier et de coller les lignes après l'élément checkDirectory(directory); contrôle. Assurez-vous juste que File.listFiles a des enfants. Réf : FileUtils.sizeOfDirectory() , Fichier.listFiles()

4 votes

Voir le bug IO-449 . Cette méthode lancera un IllegalArgumentException si le répertoire est modifié pendant l'itération.

10voto

Vishal Points 4548
public static long getFolderSize(File dir) {
    long size = 0;
    for (File file : dir.listFiles()) {
        if (file.isFile()) {
            System.out.println(file.getName() + " " + file.length());
            size += file.length();
        }
        else
            size += getFolderSize(file);
    }
    return size;
}

1 votes

@Vishal votre code a besoin d'un simple correctif, dans l'appel récursif, vous devez ajouter la taille à la taille existante et pas seulement l'assigner. size += getFolderSize(file);

0 votes

@Teja : Merci de l'avoir souligné, mais les changements seront aussi dans l'instruction if.

0 votes

Parfois sur un la croissance de (un autre fil de discussion est en train de télécharger des fichiers et des dossiers et, en même temps, j'imprime la taille du dossier au fur et à mesure de sa progression), on obtient les résultats suivants nullpointerexception à la ligne "for (File file : dir.listFiles()) {". Certains fichiers apparaissent et disparaissent rapidement dans un dossier vivant. J'ai donc ajouté une vérification de nullité pour dir.listFiles() valeur de retour avant la boucle for.

4voto

danben Points 35312

File.length() ( Javadoc ).

Notez que cela ne fonctionne pas pour les répertoires, ou que son fonctionnement n'est pas garanti.

Pour un annuaire, que voulez-vous ? Si c'est la taille totale de tous les fichiers qui se trouvent en dessous, vous pouvez parcourir récursivement les enfants en utilisant File.list() et File.isDirectory() et additionner leurs tailles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X