多层级文件夹同名校验异常:如何实现主目录与子目录准确检测?
解决文件夹重名递归校验问题
我来帮你搞定这个文件夹重名校验的问题~你当前的代码应该是只检查了主目录$DIR_IMAGE的直接子项,没有递归遍历所有层级的子目录,甚至可能误把文件当成文件夹判断,才会出现无同名却报错的情况。下面是正确的实现方案:
核心思路
要实现主目录+所有子目录的同名文件夹校验,我们需要:
- 先对用户输入的文件夹名称做基础校验(非空、无非法字符)
- 编写递归函数,遍历目标目录下的所有层级子目录,精准匹配同名文件夹
- 根据校验结果返回错误提示或执行创建逻辑
完整代码实现
// 1. 获取并处理用户输入的文件夹名称 $new_folder = trim($this->input->post('folder')); // 基础校验:禁止空名称,可根据需求添加非法字符过滤(比如禁止路径分隔符) if (empty($new_folder)) { echo json_encode(['error' => '文件夹名称不能为空']); return; } // 2. 定义递归检查函数:遍历目录及其所有子目录,查找同名文件夹 function folderExistsRecursively($targetName, $dir) { // 获取当前目录下的所有项 $items = scandir($dir); foreach ($items as $item) { // 跳过当前目录(.)和上级目录(..)的占位符 if ($item === '.' || $item === '..') { continue; } $full_item_path = $dir . DIRECTORY_SEPARATOR . $item; // 只检查文件夹,避免把同名文件误判为文件夹 if (is_dir($full_item_path)) { // 找到同名文件夹,直接返回true if ($item === $targetName) { return true; } // 递归检查当前子目录的下一级目录 if (folderExistsRecursively($targetName, $full_item_path)) { return true; } } } // 遍历完所有目录都没找到同名文件夹,返回false return false; } // 3. 执行校验并处理结果 $DIR_IMAGE = '/path/to/your/main/directory'; // 替换为你的实际主目录路径 if (folderExistsRecursively($new_folder, $DIR_IMAGE)) { // 存在同名文件夹,返回错误提示 echo json_encode(['error' => '该文件夹名称已存在,请更换名称']); } else { // 无同名文件夹,执行创建逻辑 $new_folder_path = $DIR_IMAGE . DIRECTORY_SEPARATOR . $new_folder; // mkdir第三个参数为true时,允许创建多级嵌套目录(按需启用) if (mkdir($new_folder_path, 0755, true)) { echo json_encode(['success' => '文件夹创建成功']); } else { echo json_encode(['error' => '文件夹创建失败,请检查目录权限']); } }
关键细节说明
- 递归遍历:函数
folderExistsRecursively会深入每一层子目录,确保不会遗漏任何可能的同名文件夹 - 精准判断:用
is_dir()只检查文件夹,避免把同名文件当成文件夹误判 - 提前终止:一旦找到同名文件夹就立即返回
true,不用遍历剩余目录,提升效率 - 基础校验:先过滤空名称,还可以扩展添加对
/、\等路径分隔符的禁止,防止用户通过输入路径绕过校验
内容的提问来源于stack exchange,提问作者user4419336
相关产品推荐
相关产品推荐

