PHP中file_exists无法识别带版本号文件名的问题求助
问题根因
- 逻辑设计错误:你不需要通过
DirectoryIterator遍历目录控制循环次数,foreach的循环次数是实例化DirectoryIterator时目标路径下的固定条目数,一旦条目数小于你需要的版本号计数,循环会提前终止,无法继续判断新拼接的文件名是否重名。 - 路径参数错误:初始化
DirectoryIterator时使用了dirname($file_path),如果$file_path是你存放上传文件的目标目录,dirname()会取到目标目录的上层目录,遍历的根本不是你存文件的目录,循环次数完全不符合预期。 - 文件名处理错误:每次拼接版本号时直接使用修改后的文件名作为主名,会导致版本号叠加(比如最终生成
file name_2_3.pdf而非预期的file name_3.pdf)。 - 冗余判断逻辑:外层已经判断过原始文件名存在,循环内的判断逻辑不需要和目录遍历绑定。
修复方案
直接用while循环判断拼接后的文件名是否存在,直到找到不重复的文件名即可,不需要遍历目录:
// 先拆分原始文件名的主名和后缀,避免后续版本号叠加 $file_ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $file_base_name = pathinfo($filename, PATHINFO_FILENAME); $target_file = $file_path . "/" . $filename; $counter = 1; // 只要文件存在就递增计数器拼接新文件名 while (file_exists($target_file)) { $counter++; $new_filename = $file_base_name . "_" . $counter . "." . $file_ext; $target_file = $file_path . "/" . $new_filename; } // 最终可用的文件名:有重名时为$new_filename,无重名时为原始$filename $final_filename = $counter > 1 ? $new_filename : $filename;
内容的提问来源于stack exchange,提问作者Eric Digiorgio
相关产品推荐
相关产品推荐

