web-dev-qa-db-fra.com

Obtenez la taille du fichier / répertoire en utilisant Java 7 new IO

Comment puis-je obtenir la taille d'un fichier ou d'un répertoire en utilisant le nouveau NIO dans Java 7?

46
clamp

Utilisez Files.size(Path) pour obtenir la taille d'un fichier.

Pour la taille d'un répertoire (c'est-à-dire la taille de tous les fichiers qu'il contient), vous devez toujours récursivement manuellement, pour autant que je sache.

56
Joachim Sauer

Voici un exemple prêt à fonctionner qui ignorera et enregistrera également les répertoires qu'il ne peut pas entrer. Il utilise Java.util.concurrent.atomic.AtomicLong pour accumuler l'état.

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

static long getSize(Path startPath) throws IOException {
    final AtomicLong size = new AtomicLong(0);

    Files.walkFileTree(startPath, 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();
}
6
Aksel Willgert
MutableLong size = new MutableLong();
Files.walkFileTree(directoryPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                size.add(attrs.size());
            }
}

Cela permettrait de calculer la taille de tous les fichiers d'un répertoire. Cependant, notez que tous les fichiers du répertoire doivent être des fichiers normaux, car l'API spécifie la méthode de taille de BasicFileAttributes:

"La taille des fichiers qui ne sont pas des fichiers normaux est spécifique à l'implémentation et donc non spécifiée."

Si vous tombez sur un fichier non réglementé, vous devrez soit ne pas l'inclure dans la taille, soit renvoyer une taille inconnue. Vous pouvez vérifier si le fichier est régulier avec

BasicFileAttributes.isRegularFile()
5
Ivan Senic