PHP递归复制文件夹失败求助(XAMPP本地环境)
解决PHP递归复制文件夹时的路径找不到问题
我来帮你搞定这个问题~从报错信息来看,核心问题是你代码里的路径拼接出错了,导致系统找不到指定的源目录。
问题根源
你用了$current_dir=basename(__DIR__),__DIR__是当前脚本所在的绝对路径(比如C:\xampp\htdocs\hk_domain),而basename(__DIR__)只会返回路径的最后一段,也就是目录名hk_domain。
之后你拼接出来的$src是hk_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




