我需要C中的目录列表:并获取每个目录的大小。 我正在尝试使用此代码:
int[] count = {0};
try {
Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
System.out.printf("Visiting file %s\n", file);
++count[0];
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
System.err.printf("Visiting failed for %s\n", file);
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
System.out.printf("About to visit directory %s\n", dir);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我的问题是,如果我恰好使用此方法,则会花费大量时间,因为它会访问每个文件!磁盘。我尝试使用FileVisitResult的differents选项,但无法获得所需的结果。我只需要第一级的磁盘空间。 预先感谢您的帮助。
答案 0 :(得分:4)
文件夹没有自己的(重要)尺寸。通常,在讨论文件夹大小时,其含义是该文件夹及其子文件夹下所有文件的大小之和。对于C:\,此操作需要“非常长的时间”(尝试右键单击Program Files文件夹并单击属性)。删除所有日志,然后重试。将代码花费的时间与Windows资源管理器计算该时间所花费的时间进行比较(同样,右键单击“ Program Files”文件夹并单击属性)。
在任何情况下,Apache的commons-io
都具有单线:
long size = FileUtils.sizeOfDirectory(folder);
Java-8还有另一种“纯”的单行代码:
long size = Files.walk(Paths.get("C:\\"))
.filter(p -> p.toFile().isFile())
.mapToLong(p -> p.toFile().length())
.sum();