"源文件名长度大于文件系统支持的长度无法删除"的解决方案(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; } }
好了,这个问题算是解决了吧.
没有了….哈哈哈
等我将它优化一下,然后做成可执行文件,再讲执行文件上传网络,这样的话,以后谁遇到这个问题,也就只需要运行一下这个程序,就轻轻松松搞定.
老铁们,周末睡够了懒觉该工作了.
- "源文件名长度大于文件系统支持的长度无法删除"的解决方案(Java代码实现)
- 【首发】LongPathTool 长路径文件删除工具,解决源路径太长,源文件名长度大于文件系统支持的长度问题
- 源文件名长度大于系统支持的长度
- 解决不能删除文件,出现“源文件名长度大于系统支持的长度”的提示。
- 使用递归删除源文件名长度大于系统支持的长度
- 文件删除 出现 源文件名长度大于文件系统支持的长度.请尝试将其移动到具有较短路劲名称的位置错误
- 【已解决】源文件名长度大于系统支持的长度问题
- 源文件名长度大于文件系统支持的长度。请尝试将其移动到具有较短路径名称的位置,或者在执行此操作前尝试将其重命名为较短的名称--解决办法
- java代码长度不能大于65535字节的解决办法
- 长度大于10的时候...
- Android支持的长度单位
- Android支持的长度单位。
- Android支持的长度单位
- 删除指定长度的字符
- java实现最长匹配括号的长度
- (Java)固定长度队列的实现
- Java实现-最后一个单词的长度
- Java实现单链表的插入、删除、计算链表的长度和输出链表
- 使用Struts2关于页面信息国际化(简单的)
- linux centos下安装pymysql
- 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用
- <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content
- 学习selenium,转载自http://jarvi.iteye.com/blog/1448025
- "源文件名长度大于文件系统支持的长度无法删除"的解决方案(Java代码实现)
- hdu2671
- TextView文字跑马灯效果
- Android单元测试(三):JUnit单元测试框架的使用
- 廖雪峰Python教程1轮还没学明白的(5) -- 进程和线程 -- 多进程
- mybatis学习之逆向工程
- 最小生成树练习1
- Java多线程中Lock的实现
- QTcpServer / QTcpSocket 简单示例