先看File.delete()的方法api文档
Deletes the file or directory denoted by this abstract pathname. If
this pathname denotes a directory, then the directory must be empty in
order to be deleted.
意即,删除文件或者目录,但是如果是目录,则这个目录必须是空的才能被删除。也就是说,要删一个文件夹,直接调delete方法是无法达到目的的。
看到这个api说明时,我的第一想法是,用 先根遍历序递归删除 文件夹。花了十几分钟搞定了这个工具方法和单元测试:
/**
* 先根遍历序递归删除文件夹
*
* @param dirFile 要被删除的文件或者目录
* @return 删除成功返回true, 否则返回false
*/
public static boolean deleteFile(File dirFile) {
// 如果dir对应的文件不存在,则退出
if (!dirFile.exists()) {
return false;
}
if (dirFile.isFile()) {
return dirFile.delete();
} else {
for (File file : dirFile.listFiles()) {
deleteFile(file);
}
}
return dirFile.delete();
}
单元测试
@Test
public void delete() {
File file = new File("/temp/lock11-1");
ExcelDiskUtils.deleteFile(file);
}
功能是OK的。但是晚上回家想了想。这么基础的工具方法,肯定有第三方工具类提供支持,自己再写一遍是浪费时间。于是我开始查guava和commons-io的工具类。在commons-io包里找到了一个能达到同样目的的方法org.apache.commons.io.FileUtils#deleteDirectory
/**
* Deletes a directory recursively.
*
* @param directory directory to delete
* @throws IOException in case deletion is unsuccessful
* @throws IllegalArgumentException if {@code directory} does not exist or is not a directory
*/
public static void deleteDirectory(final File directory) throws IOException {
... ...
}
看方法的api说明
Deletes a directory recursively.
意即,递归的删除一个目录。
自己在写一些常规的工具方法时,最好先看看commons包或者guava包有没有提供,如果提供了,就用他们的。不仅节约时间,提高效率,而且这些 顶尖高手写的代码的鲁棒性 都很好。万不得已再自己写。