带深度控制的递归文件夹树复制:指定深度转写实现求助
修复递归复制的深度计数并添加指定层级目录转写功能
原函数的问题分析
- 循环内无差别执行
$depth++,导致同一层级的每个文件/目录都会累加深度值,完全破坏了层级计数逻辑。 - 文件处理时的
$depth--属于无效操作,文件不属于目录层级,不影响深度计数。 - 递归调用时传递错误递增后的depth值,导致分支深度无法正确重置。
修正后的完整代码
首先定义你的跨语言转写函数(根据实际需求实现逻辑):
function transliterate($name) { // 示例:替换特殊字符为下划线,实际替换为你的转写逻辑 return preg_replace('/[^a-zA-Z0-9\-_]/', '_', $name); }
然后是修复后的递归复制函数:
// 启动复制:源目录 -> 目标目录 recurse_copy('TOCOPY/', 'TEST/'); function recurse_copy($src, $dst, $current_depth = 0) { // 调试用:打印当前路径和层级深度 echo $src . ' 层级深度:' . $current_depth . '<br>'; $dir = opendir($src); // 递归创建目标目录(自动创建不存在的父目录) @mkdir($dst, 0755, true); while(false !== ($file = readdir($dir))) { // 跳过当前目录和上级目录的占位符 if ($file === '.' || $file === '..') { continue; } $src_full_path = $src . '/' . $file; if (is_dir($src_full_path)) { // 子目录的深度为当前深度+1 $sub_dir_depth = $current_depth + 1; // 针对depth3层级(即第4层目录)执行转写 $target_dir_name = ($sub_dir_depth === 3) ? transliterate($file) : $file; $dst_full_path = $dst . '/' . $target_dir_name; // 递归处理子目录 recurse_copy($src_full_path, $dst_full_path, $sub_dir_depth); } else { // 直接复制文件到目标路径 copy($src_full_path, $dst . '/' . $file); } } closedir($dir); }
关键修复点说明
- 正确的深度计数:仅在递归处理子目录时,传递
current_depth + 1作为新层级深度,确保每个分支的深度从当前层级正确累加,不会出现同一层级深度混乱的问题。 - 指定层级转写:判断子目录的深度是否等于3(对应你示例中的depth3层级),如果是则转写目录名称后再创建目标路径。
- 健壮的目录创建:使用
mkdir(..., true)参数自动递归创建父目录,避免因父目录不存在导致的创建失败。 - 清晰的逻辑分支:跳过
.和..的逻辑更简洁,文件与目录的处理分支明确。
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

