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

当文件夹路径长度超过Windows系统的限制时,删除会遇到问题。本文介绍了一种通过Java实现的解决方案,通过递归遍历并删除长路径文件夹。作者分享了代码实现过程,包括创建和删除大量层级的文件夹,并讨论了效率问题。最后,作者计划优化代码并制作成可执行文件,方便他人使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那些写个工具,结果呢,一不小心,就干出来这么个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;
                }
            }

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

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

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

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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值