如果要删除单个文件,可以直接调用 delete() 或 deleteIfExists() 方法,它们会将文件从文件系统中删除。如果要删除目录树,则是通过 FileVisitor 的具体实现来
递归调用 delete() 或 deleteIfExists() 方法。在开始之前,要注意以下原则:
- 在删除目录之前,要确保目录是空的。
- 删除文件最好在 visitFile() 方法中。
- 最好在 postVisitDirectory() 方法中删除目录。
- 如果文件不允许访问,那么 visitFileFailed() 方法需要返回 FileVisitResult.CONTINUE 或 TERMINATE,具体返回什么由你的需求决定。
- caozuo.html" target="_blank">删除操作可以删除软链接的目标文件,但是如果目标文件在我们删除的目录树范围之外,那么不建议这么做。
下面的代码将递归删除整个 C:\rafaelnadal 目录:
class="java">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/