PHP无内置文件夹合并函数,必须明确定义行为(复制/移动/内容追加等);推荐用RecursiveDirectoryIterator+RecursiveIteratorIterator手动遍历控制冲突策略,避免exec调用及file_get_contents大文件合并。

PHP 本身没有内置函数直接“合并文件夹”,所谓“合并”必须明确定义:是把多个源目录下的所有文件复制/移动到目标目录(去重?覆盖?跳过?),还是递归合并目录结构,或是只合并同名文件的内容?不定义行为,代码必然出错。
用 RecursiveIteratorIterator 遍历多目录再逐个处理
这是最可控的方式——不依赖 shell 命令,跨平台稳定,能精确控制冲突策略。核心是手动遍历每个源目录,生成完整路径映射,再决定写入目标位置。
- 用
RecursiveDirectoryIterator+RecursiveIteratorIterator遍历每个源路径,跳过.和.. - 对每个
SplFileInfo对象,用getRealPath()获取源路径,用substr()或str_replace()计算相对于源根的相对路径 - 拼接目标路径:
$destFile = $targetDir . '/' . $relativePath;注意用dirname($destFile)提前创建子目录 - 若目标文件已存在,按需选择:
file_exists() && !is_dir()判断是否覆盖、跳过或追加
copy() 与 file_put_contents(file_get_contents(), FILE_APPEND) 的适用边界
单纯复制文件用 copy();想“内容合并”(比如把多个日志文件追加进一个总日志),才用 file_get_contents() + FILE_APPEND。后者内存压力大,大文件会崩溃。
-
copy($src, $dest):适合单文件搬运,失败返回false,记得检查返回值 -
file_put_contents($dest, file_get_contents($src), FILE_APPEND | LOCK_EX):仅适用于文本类小文件,且$dest必须可写、存在或能自动创建 - 不要对二进制文件(图片、zip)用
file_get_contents()合并——编码损坏、长度错乱几乎必然发生
避免 exec('cp -r') 或 shell_exec('robocopy') 的隐患
调用系统命令看似简单,但实际埋雷最多:权限问题、路径空格、特殊字符、Windows/Linux 行为差异、错误不被捕获。
立即学习“PHP免费学习笔记(深入)”;
-
exec("cp -r {$src} {$dest}")在 PHP 中无法捕获详细错误,$output参数也常为空 - Windows 上
robocopy路径含空格时必须加双引号,但 PHP 字符串拼接容易漏转义 - Web 服务器用户(如
www-data)往往无权执行某些系统命令,或被disable_functions禁用 - 一旦某个源目录不存在,整个命令静默失败,后续逻辑全错
真正难的不是“怎么写循环”,而是决定同名文件冲突时的行为逻辑——是保留先遇到的,还是以最后的为准,还是生成新名(file_1.txt),还是报错中断?这个策略必须在写第一行代码前就写进注释里,否则半年后你自己都看不懂为什么某张图被悄悄替换了。











