判断两文件是否同名应先明确业务场景:仅比对文件名用basename(),需忽略大小写用strcasecmp();上传校验应拼接目标路径后用file_exists();主名冲突用pathinfo($f, PATHINFO_FILENAME);rename前须检测并处理竞态条件。
PHP判断两个文件是否同名,只看文件名不看路径
直接提取 basename 比较最稳妥,basename() 会剥离路径和扩展名(可选),避免因相对路径、符号链接或大小写导致误判。
- 用
basename($path1) === basename($path2)判断基础文件名是否一致(区分大小写) - 若需忽略大小写,改用
strcasecmp(basename($path1), basename($path2)) === 0 - 注意:Windows 文件系统默认不区分大小写,Linux 区分;仅比对 basename 无法反映实际系统级冲突,仅作逻辑命名检查
- 不要用
realpath()后比对全路径——不同路径下完全可能有同名文件,这不是错误;而同名但路径不同,恰恰是常见需求场景(如多租户上传)
检测目录下是否存在同名文件(含扩展名)
上传前校验时,重点不是“是否绝对同名”,而是“目标目录里会不会撞名”。这时要结合目标目录拼接后判断文件是否存在。
- 构造预期保存路径:
$target = $upload_dir . '/' . basename($_FILES['file']['name']) - 用
file_exists($target)检查是否已存在——这是最贴近真实冲突的判断方式 - 若需排除大小写冲突(如部署在 Windows 或某些 NAS 上),可遍历目录用
scandir()+strcasecmp()手动比对,但性能差,慎用于大目录 - 避免用
is_file()单独判断:它不处理不存在的父目录,且语义不如file_exists()直观
同名但扩展名不同是否算“同名”?按业务定
“同名”的定义取决于你的业务规则。用户传 report.pdf 和 report.xlsx,系统是否允许共存?PHP 不替你做这个决策,但可以帮你拆解。