删除所有文件和子目录,但在Java中保持当前目录为空
我有一个文件夹“/a/b/”,我想删除文件夹b中的所有内容,包括文件、目录以及这些目录中的文件和子目录,但我想保持文件夹b为空而不删除它。我试过的是:删除所有文件和子目录,但在Java中保持当前目录为空,java,file-io,Java,File Io,我有一个文件夹“/a/b/”,我想删除文件夹b中的所有内容,包括文件、目录以及这些目录中的文件和子目录,但我想保持文件夹b为空而不删除它。我试过的是: Files.walk(Paths.get("/a/b/"))// .map(Path::toFile)// .sorted(Comparator.comparing(File::isDirectory))// .forEach(File::del
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
您希望在深度优先之前最后删除目录深度,即
/a/b/c/d
之前的/a/b/c
但是
File.walk()
首先遍历深度。因此,它将按以下顺序迭代:/a/b/
,/a/b/c
,/a/b/c/d
因此,颠倒
文件流的自然顺序:
.sorted(Comparator.reverseOrder())
您可以使用apache commons io中的FileUtils:
FileUtils.cleanDirectory(Paths.get("/a/b/").toFile());
文件:
更新:根据文件的文档,仅用于知识。行走:
The returned stream encapsulates one or more {@link DirectoryStream}s.
* If timely disposal of file system resources is required, the
* {@code try}-with-resources construct should be used to ensure that the
* stream's {@link Stream#close close} method is invoked after the stream
* operations are completed.
所以,除非你这样使用:
try(Stream<Path> paths = Files.walks(...)) {
//Operations here with paths
}
try(流路径=Files.walks(…){
//这里的操作具有路径
}
即使使用forEach,溪流也不会关闭。我的想法是在之后简单地重新创建它,但这条溪流显然更酷@幽灵猫嘿。对于异常处理,它就不那么酷了:'(但是谢谢:)@GhostCatPath.equals()
被覆盖。因此,最后,请再次注意,Files.walk()不会关闭打开的资源。您应该与try(Files.walk(..){}@BrotherStream一起使用。forEach()
关闭流。因此,DirectoryStreams
的资源实际上已经发布了。顺便说一句,这是个好问题;-)