You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带深度控制的递归文件夹树复制:指定深度转写实现求助

修复递归复制的深度计数并添加指定层级目录转写功能

原函数的问题分析

  1. 循环内无差别执行$depth++,导致同一层级的每个文件/目录都会累加深度值,完全破坏了层级计数逻辑。
  2. 文件处理时的$depth--属于无效操作,文件不属于目录层级,不影响深度计数。
  3. 递归调用时传递错误递增后的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:54:51