Comment puis-je obtenir la taille d'un fichier ou d'un répertoire en utilisant le nouveau NIO dans Java 7?
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.
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();
}
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()