HOWTO · PHP

PHP 中检查文件是否存在

本文介绍了如何在 PHP 中检查文件是否存在。它包括 file_exists()函数。

本页内容

使用 PHP 的 file_exists() 检查路径当前是否指向已存在的文件或目录。该函数返回布尔值,你可以根据结果决定下一步操作。检查结果只反映当时的路径状态,并不能保证之后的文件操作一定成功。

使用 file_exists() 检查路径是否存在

将路径作为字符串传入。下面的独立示例会创建临时文件、检查该文件,然后将其删除,因此成功分支不依赖项目中预先存在的文件。

运行此示例。代码中的输出标签保持英文。

本节中的代码以及显示的标签或输出仍为英文。

$directory = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'file-exists-' . uniqid('', true);
mkdir($directory);
$file = $directory . DIRECTORY_SEPARATOR . 'example.txt';
file_put_contents($file, 'Ready');

if (file_exists($file)) {
    echo "File is ready.\n";
} else {
    echo "File was not found.\n";
}

unlink($file);
rmdir($directory);

由于本数据包没有提供执行证据,因此这里不声称示例产生了任何输出。在自己的代码中,可以用相同的条件判断模式检查所需路径。结果为 true 表示检查时该路径存在;结果为 false 表示 PHP 在该次检查中未找到它。示例中的输出字符串保持英文。

区分文件和目录

file_exists() 对目录也会返回 true。如果后续操作要求路径必须是目录,请使用 is_dir() 检查;如果要求它是普通文件,则使用 is_file()。这些检查回答的是不同问题:仅确认路径存在,无法判断其类型。下面代码示例中的输出标签保持英文。

本节中的代码以及显示的标签或输出仍为英文。

$path = __DIR__ . DIRECTORY_SEPARATOR . 'uploads';

if (is_dir($path)) {
    echo 'The path is a directory.';
} elseif (is_file($path)) {
    echo 'The path is a file.';
} else {
    echo 'No file or directory was found at this path.';
}

此路径由 __DIR__ 构造;它表示当前 PHP 文件所在的目录。请将最后一个路径部分改为应用需要检查的位置。示例中的输出标签保持英文。

安全处理路径和检查结果

相对路径会根据正在运行的 PHP 进程所处的上下文进行解析,因此工作目录不同时,同一个字符串可能指向不同位置。绝对路径从文件系统根目录开始,可以明确指定目标位置。相对路径的解析结果与预期不符时,可以检查 PHP 正在使用的路径,例如在排查问题时将其与 getcwd() 结合;也可以从 __DIR__ 等已知目录构造路径。

可以根据检查结果选择合理的下一步操作,但实际操作仍可能失败。检查后路径可能发生变化,而且路径存在并不代表进程有权读取、写入或以其他方式使用它。还应检查实际操作的结果,并按应用的需要处理失败情况。

常见限制与故障排查

如果 file_exists() 意外返回 false,请先检查路径的拼写和构造方式,再确认它在 PHP 进程的环境中指向预期位置。也要考虑路径是否在多次检查之间发生了变化,以及运行中的进程能否检查相关文件系统位置。该函数只报告路径存在性检查的结果,不会诊断返回 false 的原因。

PHP 手册说明,file_exists() 用于检查文件或目录是否存在,其结果受所配置的文件系统上下文影响。不要将它当作检查远程资源是否可用的方法;应改用适合该资源的协议或服务专用机制。请参阅 PHP 手册中的 file_exists(),了解该函数的参数、返回值和相关说明。

需要重复检查时,不要假定之前的结果仍然有效。条件允许时,直接执行所需操作并处理其结果。这样即使文件系统在检查与操作之间发生变化,程序也能正确处理。