【发布时间】:2019-09-13 18:07:30
【问题描述】:
我需要 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 的不同选项,但我无法获得所需的结果。我只需要磁盘空间的第一级。 提前感谢您的帮助。
【问题讨论】:
-
请注意,在文件访问期间记录日志可能会大大减慢操作速度,因为每条日志消息都有成本。您可以尝试记录每 1000 个文件,看看它是否更快
-
“访问每个文件需要很多时间” - 为了计算访问每个文件所需的内存消耗。如果您在仍会访问每个文件的 linux 系统上执行
du --max-depth=1之类的操作 - 它只会报告一个级别的大小。但是,您的代码的主要问题很可能是 Fernando 所指出的:日志记录会大大降低速度。 -
真的可以让它变得非常快吗?如果你想直接从 Windows 资源管理器检查目录的大小,如果有很多文件,也可能需要几秒钟。不了解linux系统。
-
这也取决于您的磁盘。如果你有一个 5400RPM 的硬盘,与三星 evo 970 plus SSD 相比,差异将是巨大的 :)
-
您想要文件中的数据大小还是磁盘上的大小? Windows 通常使用 4,096 字节块。此外,对于小文件,数据存储在 MFT 中。