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

【以下回答由 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()来删除文件夹本身。

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



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

用cmd命令试试,使用rmdir或rd命令删除文件夹。例如,输入"rmdir /s /q 文件夹路径"(不包含引号),其中/s参数用于删除子文件夹和文件,/q参数用于静默删除操作,不需要确认。还不行就进入安全模式试试

看您的问题,创建了太多文件导致删除文件错误,不能正常清除,以递归删除则报超出错误,我的建议是覆盖此文件夹,windows中在创建文件时,如重名则会提示是否进行覆盖原文件夹的所有内容,如不能,在网上搜搜关于文件覆盖的操作,本人才知浅陋,无法为您提供最为有效且快速的方法,还请您多多见谅