当文件夹很大时,子目录超多时,发现windows删除文件夹很慢,有时删除了一天都还没删除,一直在收集发现文件,我有一次删除一个文件夹,发现里面有几百万个文件,导致windows一直删除不成功。为了快速删除超大文件夹,我们可以自己写一个删除文件夹的java程序的。
因为java删除目录时,必须要保证目录为空才能删除,我们必须先将目录里面的文件删除。这里使用java的堆栈stack来删除目录,利用堆栈的先进后出的原理,实现目录从里向外删除。
大概思路:先从顶级目录遍历,发现是目录,检查是否有文件或子目录,有:则当前目录入栈,对子目录或文件检查入栈,循环操作;没有:则直接删除。这样保证父目录一定是先入栈,子目录后入栈
代码如下:
import java.io.File;
import java.util.Stack;
/**
* 使用java的堆栈先进后出的特点来删除多层文件夹
* @author prince
*
*/
public class TestDelDir {
public static void main(String[] args) {
File root=new File("C:\\Users\\prince\\Desktop\\a");
Stack<File> stack=new Stack<>();
//先把顶级目录放入堆栈中
stack.push(root);
while(stack.size()>0){
//栈顶元素出栈
File file = stack.pop();
if(file.isDirectory()){
//文件是目录时,要对子目录进行入栈递归
File[] subfiles = file.listFiles();
if(subfiles!=null&&subfiles.length>0){
stack.push(file);
for(File subfile:subfiles){
if(!subfile.isDirectory()){
//如果是文件时,直接删除即可
System.out.println("删除文件-1----"+subfile.getAbsolutePath());
subfile.delete();
}else{
File[] ls = subfile.listFiles();
//如果是目录
if(ls==null||ls.length==0){
//目录为空时,直接删除
System.out.println("删除空目录----"+subfile.getAbsolutePath());
subfile.delete();
}else{
//目录不为空时,进栈,继续遍历子目录
System.out.println("非空目录入栈---"+subfile.getAbsolutePath());
stack.push(subfile);
}
}
}
}else{
//文件为非目录,直接删除
System.out.println("删除文件-2----"+file.getAbsolutePath());
file.delete();
}
}
}
}
}
运行效果:

删除最终过程

入栈出栈过程

入栈出栈删除过程
以上就是堆栈入栈出栈的过程,通过测试,发现使用堆栈删除文件夹,比使用递归的方法删除文件夹要快的多,递归删除效率相当低