PHP检查文件是否存在

PHP检查文件是否存在

引言

上传头像、读取配置、缓存命中判断之前,都要先确认文件是否存在。PHP里file_exists判断文件或目录,is_file专门判断普通文件,is_dir判断目录,三者语义不同,用错会把目录当成文件导致后续读取报错。

file_exists 判断存在

$path = './config/config.php';
if (file_exists($path)) {
    echo '文件存在';
} else {
    echo '文件不存在';
}

文件或目录存在都返回true,路径不存在、权限不可访问返回false。

is_file 判断是普通文件

if (is_file($path)) {
    echo '这是一个普通文件';
}

目录、符号链接、管道都返回false,读取文件前用它最稳妥。

is_dir 判断目录

$dir = './uploads';
if (is_dir($dir)) {
    echo '目录存在';
}

专门判断目录,适合上传前检查目录是否已建。

判断可读性再操作

if (is_file($path) && is_readable($path)) {
    $content = file_get_contents($path);
}

存在不代表可读,权限不足时file_get_contents会警告,先加is_readable判断。

路径拼接注意

$file = __DIR__ . '/../data/' . $name;

用绝对路径拼接,避免相对路径受当前工作目录影响,跨目录包含时不容易找错文件。

注意事项

  • file_exists缓存了文件状态,删改文件后可用clearstatcache清缓存;
  • 判断普通文件用is_file,别只靠file_exists,目录会误判;
  • 检查存在后还要is_readable/is_writable,权限是另一道关;
  • 文件名含中文或特殊字符注意编码统一,避免误判不存在;
  • 防路径穿越,用户传入的文件名先过滤..和绝对路径;
  • 大量循环判断文件时注意stat缓存带来的性能影响。

总结

file_exists判断文件或目录是否存在,is_file判断普通文件,is_dir判断目录,is_readable/is_writable判断读写权限。读取配置、上传文件、缓存命中前先做存在性和权限判断。注意clearstatcache清理状态缓存,用户传入文件名要防路径穿越,跨目录用DIR拼绝对路径,避免相对路径偏移导致找错文件。


emer 发布于  2026-10-22 07:10