You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP递归复制文件夹失败求助(XAMPP本地环境)

解决PHP递归复制文件夹时的路径找不到问题

我来帮你搞定这个问题~从报错信息来看,核心问题是你代码里的路径拼接出错了,导致系统找不到指定的源目录。

问题根源

你用了$current_dir=basename(__DIR__)__DIR__是当前脚本所在的绝对路径(比如C:\xampp\htdocs\hk_domain),而basename(__DIR__)只会返回路径的最后一段,也就是目录名hk_domain

之后你拼接出来的$srchk_domain/img,这相当于在当前脚本所在目录(C:\xampp\htdocs\hk_domain)下再去找hk_domain/img,这个路径根本不存在,自然会触发找不到目录的报错。

修复方案

直接用__DIR__来拼接路径就可以了,因为它本身就是当前脚本的绝对路径,能精准定位到你的img文件夹。同时我们还可以优化代码的错误处理,让它更健壮:

修改后的完整代码

function recurse_copy($src, $dst) {
    // 先检查源目录是否存在
    if (!is_dir($src)) {
        die("错误:源目录 $src 不存在");
    }
    // 创建目标目录,支持递归创建父目录,同时检查创建是否成功
    if (!is_dir($dst) && !mkdir($dst, 0755, true)) {
        die("错误:无法创建目标目录 $dst");
    }
    // 打开源目录并检查是否成功
    $dir = opendir($src);
    if (!$dir) {
        die("错误:无法打开源目录 $src");
    }
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            // 用系统兼容的目录分隔符,适配Windows/Linux
            $srcFile = $src . DIRECTORY_SEPARATOR . $file;
            $dstFile = $dst . DIRECTORY_SEPARATOR . $file;
            if (is_dir($srcFile)) {
                recurse_copy($srcFile, $dstFile);
            } else {
                // 检查文件复制是否成功
                if (!copy($srcFile, $dstFile)) {
                    echo "警告:复制文件 $srcFile 到 $dstFile 失败\n";
                }
            }
        }
    }
    closedir($dir);
}

// 直接用__DIR__拼接绝对路径
$src = __DIR__ . "/img";
$dst = __DIR__ . "/img2";
recurse_copy($src, $dst);

关键修改点

  • 去掉错误的basename(__DIR__),改用__DIR__直接拼接,确保路径绝对正确
  • 添加源目录存在性检查,避免无效操作
  • 创建目标目录时使用mkdir的第三个参数true,支持递归创建多层目录,同时检查创建结果
  • DIRECTORY_SEPARATOR代替硬编码的/,适配Windows和Linux系统
  • 增加文件复制失败的提示,方便排查问题
  • 检查opendir是否成功,避免后续readdir报错

这样修改后,你的递归复制功能就能正常工作啦~

内容的提问来源于stack exchange,提问作者gosulove

火山引擎 最新活动