[NIO.2] 第三十五篇 编写一个文件删除应用
程序员文章站
2022-04-25 10:01:13
...
如果要删除单个文件,可以直接调用 delete() 或 deleteIfExists() 方法,它们会将文件从文件系统中删除。如果要删除目录树,则是通过 FileVisitor 的具体实现来递归调用 delete() 或 deleteIfExists() 方法。在开始之前,要注意以下原则:
下面的代码将递归删除整个 C:\rafaelnadal 目录:
文章来源:http://www.aptusource.org/2014/04/nio-2-writing-a-file-delete-application/
- 在删除目录之前,要确保目录是空的。
- 删除文件最好在 visitFile() 方法中。
- 最好在 postVisitDirectory() 方法中删除目录。
- 如果文件不允许访问,那么 visitFileFailed() 方法需要返回 FileVisitResult.CONTINUE 或 TERMINATE,具体返回什么由你的需求决定。
- 删除操作可以删除软链接的目标文件,但是如果目标文件在我们删除的目录树范围之外,那么不建议这么做。
下面的代码将递归删除整个 C:\rafaelnadal 目录:
import java.io.IOException; import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.util.EnumSet; class DeleteDirectory implements FileVisitor { boolean deleteFileByFile(Path file) throws IOException { return Files.deleteIfExists(file); } @Override public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException { if (exc == null) { System.out.println("Visited: " + (Path) dir); boolean success = deleteFileByFile((Path) dir); if (success) { System.out.println("Deleted: " + (Path) dir); } else { System.out.println("Not deleted: " + (Path) dir); } } else { throw exc; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException { boolean success = deleteFileByFile((Path) file); if (success) { System.out.println("Deleted: " + (Path) file); } else { System.out.println("Not deleted: " + (Path) file); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException { //report an error if necessary return FileVisitResult.CONTINUE; } } class Main { public static void main(String[] args) throws IOException { Path directory = Paths.get("C:/rafaelnadal"); DeleteDirectory walk = new DeleteDirectory(); EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); Files.walkFileTree(directory, opts, Integer.MAX_VALUE, walk); } }
文章来源:http://www.aptusource.org/2014/04/nio-2-writing-a-file-delete-application/
下一篇: [NIO.2] 第三十三篇 遍历目录树