您的位置:首页 > 编程语言 > Java开发

"源文件名长度大于文件系统支持的长度无法删除"的解决方案(Java代码实现)

2017-06-25 13:24 555 查看
那些写个工具,结果呢,一不小心,就干出来这么个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 (!file.exists()) {
file.mkdirs();
}
addFolder(file);
}
/**
* 在指定文件夹添加无限个文件夹,相同的名字,用递归的方式
* 直到系统报错
*/
public static void addFolder(File file){
if(file.isDirectory()){
File file1=new File(file.getAbsoluteFile()+File.separator+"1");
if (!file1.exists()) {
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.apache.commons.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){
/
4000
/初始化计数器
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+"层文件夹===");
}
//及时清空,否则会出现栈内存溢出StackOverflowError
sub=null;
}else {
if(sub.length>0){
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.println(f.getAbsolutePath());
}*/else {
delAll(sub[0]);
}

}
//及时清空,否则会出现堆内存溢出
sub=null;
}

}

}


看运行结果:



这里说一下,为什么上面代码里有这段里面totalSize=totalSize-199;我不是totalSize=totalSize-200;我也是百思不得其解,用200,就会报空指针,199不会.哈哈哈,如果大神们直到原因,还希望留言交流一下>>>>>>>>>>>

while(true){
//初始化计数器
count=0;
totalSize=totalSize-199;

//开始执行删除操作
delAll(file);
if(totalSize<1){
break;
}
}


好了,这个问题算是解决了吧.

没有了….哈哈哈



等我将它优化一下,然后做成可执行文件,再讲执行文件上传网络,这样的话,以后谁遇到这个问题,也就只需要运行一下这个程序,就轻轻松松搞定.

老铁们,周末睡够了懒觉该工作了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐