埋了吧汰. 2023-09-15 20:42 采纳率: 100%
浏览 13
已结题

java代码递归出错导致创的文件夹删不掉了

学java IO流的时候,跟着视频写了下面这段代码

import java.io.*;

public class ByteStreamDemo1 {
    public static void main(String[] args) throws IOException {

        //1.创建对象表示数据源
        File src = new File("E:\\test");
        //2.创建对象目的数据
        File dest = new File("E:\\hello");
        //3.调用拷贝函数
        copydir (src, dest);
    }

    private static void copydir(File src, File dest) throws IOException {
        dest.mkdirs();
        //1、进入数据源
        File[] files = src.listFiles();
        //2、遍历数组
        for (File file : files) {
            //3、判断为文件-拷贝
            if (file.isFile()) {
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()));
                byte[] bytes = new byte[1024];
                int len;
                while((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                fos.close();
                fis.close();
            } else{
                // 4、判断为文件夹-递归
                copydir(file, new File(dest, file.getName()));
            }
        }
    }

但是写的时候应该最后那个递归忘写else了,导致在我的E盘建了一个名为hello的很多层嵌套的文件夹,具体有多少层呢,我只能说有很多,我曾用c++打了一千个路径

void test() {
    
    for (int i = 1; i <= 1000; ++i) {
        cout << "\\\\hello";
    }
}

复制到E盘路径,仍然没有到达最底层那个文件
后来我试图魔法打败魔法,写了一段代码试图递归删除它,一运行给我报下面的错误

java.io.IOException: Cannot access file with path exceeding 32000 characters

意思是:无法访问路径超过 32000 个字符的文件
我tm直接心态崩了
总结一下我尝试过的所有删除方法,有些是网上找的建议:
1、直接右键删除
报错如下

img

点重试会卡退
2、用火绒粉碎,普通粉碎告诉我粉碎失败,勾选那个彻底粉碎结果粉碎了一下午也没粉完
3、用Visual Studio以及用IDEA打开,试图在软件里删除,结果都卡退了
4、用一些博客里说的用命令窗口用命令删除,结果也没用

img

5、秉持着重启解决一切的心态,正好赶上系统又更新,我就更新并重启了,结果不出所料,依然没有卵用

xdm我已经快放弃了,是不是只能接受我室友的建议格式化E盘了,虽然这个嵌套文件夹里面什么都没有,但是我与它战斗了大半天,心里已经腻死了,很想解决它,希望各位出出主意

img

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-15 22:08
    关注

    【以下回答由 GPT 生成】

    首先,出现这个错误的原因是在递归复制文件夹的过程中,没有正确地处理文件夹的情况。因此,在最后的递归调用时,会尝试复制文件夹本身,而不是复制文件夹中的文件和子文件夹。

    为了解决这个问题,我们可以修改代码,将判断文件夹的逻辑与判断文件的逻辑分开处理。这样,在复制文件夹时,我们只需要复制文件夹本身,而不需要递归复制文件夹中的内容。

    下面是修改后的代码:

    import java.io.*;
    
    public class ByteStreamDemo1 {
        public static void main(String[] args) throws IOException {
            //1.创建对象表示数据源
            File src = new File("E:\\test");
            //2.创建对象目的数据
            File dest = new File("E:\\hello");
            //3.调用拷贝函数
            copyDir(src, dest);
        }
    
        private static void copyDir(File src, File dest) throws IOException {
            dest.mkdirs();
            //1、进入数据源
            File[] files = src.listFiles();
            //2、遍历数组
            for (File file : files) {
                if (file.isFile()) {
                    //3、判断为文件-拷贝
                    copyFile(file, new File(dest, file.getName()));
                } else {
                    // 4、判断为文件夹-复制文件夹本身
                    File destFolder = new File(dest, file.getName());
                    destFolder.mkdir();
                    // 递归复制文件夹中的内容
                    copyDir(file, destFolder);
                }
            }
        }
    
        private static void copyFile(File src, File dest) throws IOException {
            FileInputStream fis = new FileInputStream(src);
            FileOutputStream fos = new FileOutputStream(dest);
            byte[] bytes = new byte[1024];
            int len;
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
            fos.close();
            fis.close();
        }
    }
    

    在修改后的代码中,我们新增了一个copyFile方法,用于复制文件。在主方法中调用copyDir方法时,如果遇到文件,会调用copyFile方法来复制文件;如果是文件夹,会先创建目标文件夹,然后递归调用copyDir方法来复制文件夹中的内容。

    这样,代码就可以正确地复制文件夹了。

    关于删除文件夹的问题,你可以使用以下代码来递归删除文件夹及其内容:

    public static void deleteDir(File dir) {
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    deleteDir(file);
                }
            }
        }
        dir.delete();
    }
    

    使用上述代码来删除文件夹时,也需要先判断文件夹是否为空,然后递归调用deleteDir方法来删除文件夹中的内容。最后,调用dir.delete()来删除文件夹本身。

    请注意,删除文件夹时需要小心,确保不要删除重要的文件。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月24日
  • 已采纳回答 9月16日
  • 创建了问题 9月15日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改