java - 删除所有文件和子目录,但在 Java 中将当前目录保持为空

标签 java file-io

我有一个文件夹“/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/

相关文章:

python - 存储列表,然后将其作为整数读取

Java 让用户创建和执行算法

Java 和 RFC 3986 URI 编码

java - 为什么数据成员用默认值初始化,而局部变量则不然?

c++ - 优化功能以将位写入文件

c++ - `fwrite` 不害怕 't work directly after ` 吗?

Java 正则表达式日期字符串

java - 过滤 JSON 响应 Java Spring - RESTful 服务

在 Netbeans IDE 中构建和清理后,Java 代码找不到资源文件?

c++ - 在 C++ 中读取文件并处理可能的错误的可移植方法