Найдя эту страницу из быстрого гугла, я использовал решение Kirk
, однако оно медленное, если вы вызываете его несколько раз в одном и том же каталоге или в каталоге, в котором много файлов. Это связано с цикличностью по всем файлам каждый раз, так что я немного его оптимизировал:
function fileExists($fileName) {
static $dirList = [];
if(file_exists($fileName)) {
return true;
}
$directoryName = dirname($fileName);
if (!isset($dirList[$directoryName])) {
$fileArray = glob($directoryName . '/*', GLOB_NOSORT);
$dirListEntry = [];
foreach ($fileArray as $file) {
$dirListEntry[strtolower($file)] = true;
}
$dirList[$directoryName] = $dirListEntry;
}
return isset($dirList[$directoryName][strtolower($fileName)]);
}
Я сбросил флаг, чтобы проверить нечувствительность к регистру, так как я предполагаю, что вы просто используете file_exists
, если вам не нужно это поведение, поэтому флаг показался излишним. Я также ожидаю, что если вы делаете что-то, кроме тривиального сценария, вы захотите превратить это в класс, чтобы получить больший контроль над кэшированием списка каталогов, например, сбросить его, но это выходит за рамки того, что мне нужно, и это должно быть тривиально, если вам это нужно.