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

来源:互联网 发布:安装ubuntu u盘 编辑:程序博客网 时间:2024/05/20 13:38

那些写个工具,结果呢,一不小心,就干出来这么个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){                //初始化计数器                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;                }            }

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

没有了….哈哈哈
这里写图片描述

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

老铁们,周末睡够了懒觉该工作了.

阅读全文
0 1
原创粉丝点击