源⽂件名长度⼤于⽂件系统⽀持的长度⽆法删除的解决⽅案(Java代码实现)
那些写个⼯具,结果呢,⼀不⼩⼼,就⼲出来这么个bug.就是在⽂件夹⾥创建同名的⽂件夹,⼀直创建到软件奔溃.这个问题很低级,但是想⼿动删除的时候,才发现是多么痛的领悟.
诺,就是这样⼦,就压根不让你删除….
因Windows⽂件夹有长度限制,在路径长度达到32767个字符时,删除⽂件时就会出现因“该⽂件夹包名称过长且⽆法放⼊回收站的项⽬”错误,因此可⽤本经验中⽅法快速安全删除整个⽂件夹。
然后百度各种⽅案,各种蛋疼,还感觉很⾼科技的样⼦.
最为⼀个软件开发⼈员,不能忍啊.
于是乎,⾃⼰怎么写进去的,就怎么把它删掉吧.
我先说说我的解决⽅案,其实代码也不是很多,不过是⼀百来⾏,还加上注释,引⼊包名等:
⼀,遍历这个⽂件夹;
⼆,判断这个⽂件夹下⾯是否还有⽂件夹.其实就是判断长度⽽已;
三,有⽂件夹,就采⽤递归的⽅式继续往下遍历
四,直到最后⼀个,因为它下⾯肯定是空的
五,然后⼀层⼀层的往前⾯删
说明:第五点效率⾮常的低,因为每删除⼀个就要遍历⼀次.经过我⽇志输出,在我的电脑上总共创建了4000多层⽂件夹(这⾥要注意.如果你在最外层通过⽂件的属性查看⽂件夹的时候,才显⽰110多个,我不知道其他电脑是否是这样.如下图),如果是⼀个⼀个的删除,这需要半个多⼩时(好吧,我表⽰我
电脑i3的…)
刚开始,我删除的时候,以为就119个,我先⼿动删除,就是进去⼗多层,然后将⾥⾯的剪切出来,
然后把这⼗多层删掉,等我再刷新,在通过⽂件夹的属性看剪切出来的时候,还是这个数,你知道宝宝⼼⾥有多崩溃么,以为是病毒.然后我就写代码,遍历到第100个的时候,删除,额,没错,删不掉,还报了⼀个栈内存溢出…..
所以针对第五步,看这个最多显⽰是110多⼀点,那我每次删除100层应该是没有问题的,事实上这的确可以,效率⼤⼤的提⾼,只需要⼗多秒………哈哈哈.删完了后,没有删的了,我⾃⼰⼜写了⼀个⽆线循环创建⽂件夹的,然后直到栈内存溢出…..
波爷中医⼩⼿⼀贱,啥都好办.
好了,我说了这么多,你应该知道我要表达啥了,如果不知道,那就怪我吧.
现在⼲货来了,特别说明⼀下,就是还能不能删200层,3000层,甚⾄1000层呢?我还没有试呢.⼤神们可以试试.
先来个递归⽆线创建⼦⽂件夹的代码吧:
棉花糖发明者>拍一拍怎么玩package com.wangjun.delet;
import java.io.File;
public class CreateFiles {
static int a=1;
public static void main(String[] args) {
File file = new File("E:\\中版传媒\\案例\\图⽚批量合包\\1");
System.out.println("开始....");
if (!ists()) {
file.mkdirs();
}
addFolder(file);
}
/**结婚周年礼物
* 在指定⽂件夹添加⽆限个⽂件夹,相同的名字,⽤递归的⽅式
* 直到系统报错
*/
public static void addFolder(File file){
if(file.isDirectory()){
File file1=new AbsoluteFile()+File.separator+"1");
if (!ists()) {
file1.mkdirs();
}
if(file1.isDirectory()){
addFolder(file1);
}
}
a++;
System.out.println("已经创建"+a+"层⽂件夹");
}
}
运⾏这个代码,会是这样的结果:
杀⼿(解决⽅案)来了:
package com.wangjun.delet;
import java.io.File;
import java.io.IOException;
import org.apachemons.io.FileUtils;
import org.apachemons.io.FileUtils;
/**
* 因为不⼩⼼,写了⼀个死循环,在电脑⾥创建的了n多层空⽂件夹
* 并且⼿动最外层删除不掉.
* 所以⽤写了本代码,从⾥向外的进⾏删除操作.
*
* @author王俊
* @since 2017.06.24
*
*/
public class Dele {
//⽂件夹所嵌套的层数
public static int totalSize;
//计数器
public static int count;
//每次删除的数量是100
public static int num=0;
/
/每次删除的数量是100
public static boolean first=true;
public static void main(String[] args) {
File file = new File("E:\\中版传媒\\案例\\图⽚批量合包\\1");
try {
long firstTime=System.currentTimeMillis();
while(true){
//初始化计数器
count=0;
totalSize=totalSize-199;
//开始执⾏删除操作
delAll(file);
if(totalSize<1){
break;
}
}
long okTime=System.currentTimeMillis();
System.out.println("总共耗时:"+((okTime-firstTime)/1000)+"秒");
} catch (IOException e) {
e.printStackTrace();
}
}
/
**
* 删除⽂件夹下所有内容,包括此⽂件夹删除⽂件夹下所有内容,包括此⽂件夹 *
* @param f
* @throws IOException
*/
public static void delAll(File f) throws IOException {
File[] sub=f.listFiles();
//如果是第⼀次进来
if (first) {
if(sub.length>0){
count++;
delAll(sub[0]);
教育学复习资料}else {
totalSize=count;
first=false;
System.out.println("===总共有"+totalSize+"层⽂件夹===");
}
akb48橘梨纱//及时清空,否则会出现栈内存溢出StackOverflowError
sub=null;
}else {
if(sub.length>0){
count++;
看运⾏结果:
这⾥说⼀下,为什么上⾯代码⾥有这段⾥⾯totalSize=totalSize-199;我不是totalSize=totalSize-200;我也是百思不得其解,⽤200,就会报空指针,199不会.哈哈哈,如果⼤神们直到原因,还希望留⾔交流⼀下>>>>>>>>>>> count++;
if (totalSize-count<100){
FileUtils.deleteDirectory(f);
System.out.println(">>>还有"+(count-1)+"层⽂件夹没有删除");
}/*else if(totalSize-count<100){
//重新遍历
//FileUtils.deleteDirectory(f);
delAllLast(f);
System.out.AbsolutePath());
}*/else {
delAll(sub[0]);
}
}
//及时清空,否则会出现堆内存溢出
sub=null ;
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论