我有一个文件夹“/a/b/”,我想删除文件夹b内的所有内容,包括文件、目录和这些目录内的文件和子目录,但我想保持文件夹b为空而不删除它.我试过的是:
Files.walk(Paths.get("/a/b/"))//
.map(Path::toFile)//
.sorted(Comparator.comparing(File::isDirectory))//
.forEach(File::delete);
此解决方案在删除文件夹 b 内的所有内容时工作正常,但它也删除了我想保留的文件夹 b。我应该如何更改这里以保留文件夹 b,谁能给我提示?谢谢
最佳答案
过滤除此目录之外的所有目录:
Path rootPath = Paths.get("/a/b/");
Files.walk(rootPath)//
.filter(p -> !p.equals(rootPath))
.map(Path::toFile)//
.sorted(Comparator.comparing(File::isDirectory))//
.forEach(File::delete);
请注意 .sorted(Comparator.comparing(File::isDirectory))
可能还不够。
首先删除目录很重要,但它们的删除顺序也很重要。
假设您有目录:/a/b/
、/a/b/c
、/a/b/c/d
.
您想在 depth-first 之前删除目录 depth-last,即在 /a/b/c
之前删除 /a/b/c/d
。
但是 File.walk()
是深度优先的。所以它会按顺序迭代:/a/b/
, /a/b/c
, /a/b/c/d
.
所以反转 File
流的自然顺序:
.sorted(Comparator.reverseOrder())
关于java - 删除所有文件和子目录,但在 Java 中将当前目录保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52110889/