Java文件夹递归删除方法
前一段时间写程序的时候需要用java删除一个文件夹以及文件夹下的所有功能,java文件类中的delete方法只能删除空文件夹,后来到网上搜了一下,发现有些朋友已经实现了这个功能,并且提供了源代码,于是找了一个编译测试,通过,一切顺利!但是过了一个多月发现出了问题,因为我是在linux平台上开发,但是系统可能运行在window平台上。在linux平台上运行正确,但是到windows平台上以后,发现提示用户删除文件成功了,但是实际文件并没有被删除?debug了半天才找到问题原因:原来在linux平台上即使文件被其他程序打开也同样可以使用java文件类的delete方法删除,而windows平台却不可以。
下面是我修改后的文件夹删除类的源代码:
public class FolderDeleter {
private static Log log = LogFactory.getLog(FolderDeleter.class);
private static java.io.File m_root;
private static ArrayList m_dirs;
/**
* 递归删除文件夹以及子文件夹
* @param dir 文件夹绝对路径
* @throws Exception 删除文件异常
*/
@SuppressWarnings("unchecked")
public static void deleteDirs(java.io.File dir) throws Exception {
m_root = dir;
m_dirs = new ArrayList();
if (!m_root.isDirectory()) {
throw new Exception("Exception:"" + m_root.toString()
+ "" is not a director");
} else {
// delete all director
try {
m_dirs.add(m_root);
myDelete();
} catch (Exception e) {
log.error(">>>删除文件出错:", e);
throw e;
}
}
}
/**
*
* @param dirPath
* String a director file path;
* @throws Exception
* if dirPath is not a director file path
*/
public static void deleteDirs(String dirPath) throws Exception {
m_root = new File(dirPath);
deleteDirs(m_root);
}
/**
* 递归删除文件夹以及子文件夹
* @param dirPath 文件夹绝对路径
* @throws Exception 删除文件异常
*/
public static void deleteSubDirs(String dirPath) throws Exception {
m_root = new java.io.File(dirPath);
deleteSubDirs(m_root);
}
/**
* 递归删除文件夹以及子文件夹
* @param dir 文件夹绝对路径
* @throws Exception 删除文件异常
*/
public static void deleteSubDirs(java.io.File dir) throws Exception {
m_root = dir;
m_dirs = new ArrayList();
// deleteDirs(m_root);
if (!m_root.isDirectory()) {
throw new Exception("Exception:"" + m_root.toString()
+ "" is not a director");
} else {
for (int i = 0; i < m_dirs.size(); i++) {
System.out.println(((File) m_dirs.get(i)).toString());
}
try {
myDelete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* visit all a director and save them in a list
*/
@SuppressWarnings("unchecked")
private static void visitAll(java.io.File tempRoot) throws Exception {
java.io.File[] dirs = tempRoot.listFiles();
if (dirs != null) {
List dirsList = Arrays.asList(dirs);
if (dirsList == null) {
try {
if(!tempRoot.delete())
throw new Exception("Exception: delete file " +
tempRoot.getName() + " false!");
} catch (Exception e) {
throw e;
}
} else {
m_dirs.addAll(dirsList);
for (int i = 0; i < dirsList.size(); i++) {
tempRoot = (java.io.File) dirsList.get(i);
visitAll(tempRoot);
}
}
}
}
/*
* do delete
*/
private static void myDelete() throws Exception {
visitAll(m_root);
if (m_dirs != null) {
for (int i = m_dirs.size() - 1; i >= 0; i--) {
java.io.File f = (java.io.File) m_dirs.remove(i);
String fileName = f.toString();
if (!f.delete()) {
throw new Exception("Exception: delete file " + fileName + " false!");
}
}
} else {
throw new Exception("Exception: read file list of " + m_root.toString()
+ "false!");
}
}
}
这个类参考了 Java删除文件夹 (我参考的不是这篇文件,时间长了找不到原始文章,但是这篇文章类似)。
我在这里想说两个问题:
- 如何正确进行异常处理?
我理解的异常处理应该是:如果当前代码能够处理发生的异常,那么当前代码可以使用try{...}catch(...)来进行合适的异常处理,否则应该将异常向上抛,让更高层的代码来进行处理。具体针对 Java删除文件夹这篇文章中的代码我觉得至少以下两个地方的处理有待商榷:(1) rootDelete()
方法中的
if(!f.delete())
因为java文件类的delete方法,如果删除失败,并不会抛出异常,而是通过返回值来判断是否删除成功,那么如果删除失败就因该抛出一个异常来通知上层代码,文件删除失败了,而不应该log一下了事;(2)
deleteDirs中catch住异常以后只是log了一下异常,这样即使出现了异常删除失败的话,上层代码是无法知道底层究竟发生了什么问题?
- 文件操作无论如何都应该最后把打开的文件流给关闭
我的程序只所以出现上面的bug,主要还是我在别的地方打开文件以后没有及时关闭,造成无法删除,所以在操作文件进行读写的时候,应该尽可能符合以下格式:
try {
......//打开文件
} catch (Exception e) {
......//处理异常
} finally {
......//关闭文件
}
注:非常感谢 MyGarden 提供上面的删除文件夹的源代码