文件删除
删除单个文件的操作很简单,如果要删除一个目录树的话,需要实现FileVisitor接口然后递归地调用delete()或deleteIfExists()方法。在看代码之前,需要注意一下问题。
在删除一个目录之前,要先删除里面的文件。visitFile()方式是执行删除每个文件最好的方式。因为只有在目录为空的情况下才可以删除,所以建议在postVisitDirectory()方法中删除目录操作。如果文件不允许访问,你可以根据自己的决定使用visitFileFailed()方法来返回FileVisitResult.CONTINUE或TERMINATE。删除过程可以跟踪符号链接文件,但是这不是一个可取的方式。因为符号链接可能指向超过删除域之外的文件。如果你能确认这种情况不会发生,或是还有其他约束条件阻止此情况发生,那么你可以跟踪符号链接文件。下面的程序用来删除C:\rafaelnadal目录下所有的目录和文件。
importjava.io.IOException;importjava.nio.file.FileVisitOption;importjava.nio.file.FileVisitResult;importjava.nio.file.FileVisitor;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.nio.file.attribute.BasicFileAttributes;importjava.util.EnumSet;classDeleteDirectoryimplementsFileVisitor {booleandeleteFileByFile(Path file)throwsIOException {returnFiles.deleteIfExists(file);
}
@OverridepublicFileVisitResult postVisitDirectory(Object dir, IOException exc)throwsIOException {if(exc ==null) {
System.out.PRintln("Visited: " +(Path) dir);booleansuccess =deleteFileByFile((Path) dir);if(success) {
System.out.println("Deleted: " +(Path) dir);
}else{
System.out.println("Not deleted: " +(Path) dir);
}
}else{throwexc;
}returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)throwsIOException {returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult visitFile(Object file, BasicFileAttributes attrs)throwsIOException {booleansuccess =deleteFileByFile((Path) file);if(success) {
System.out.println("Deleted: " +(Path) file);
}else{
System.out.println("Not deleted: " +(Path) file);
}returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult visitFileFailed(Object file, IOException exc)throwsIOException {//report an error if necessaryreturnFileVisitResult.CONTINUE;
}
}classMain {publicstaticvoidmain(String[] args)throwsIOException {
Path directory= Paths.get("C:/rafaelnadal");
DeleteDirectory walk=newDeleteDirectory();
EnumSet opts=EnumSet.of(FileVisitOption.FOLLOW_LINKS);
Files.walkFileTree(directory, opts, Integer.MAX_VALUE, walk);
}
}