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拼绝对路径,避免相对路径偏移导致找错文件。