Я хочу проверить, нет ли файла. Когда file_exists() возвращает false я не могу быть уверен, что файл не существует или у меня нет разрешения на файл.
Как распознать эти две возможности?
Может быть, is_readable – это то, что вы хотите?
Сначала вы можете попробовать file_exists (). В случае сбоя вы можете попробовать fopen () с флагом + a. Если это не удается, у вас нет разрешения.
Я хочу проверить, нет ли файла. Когда
file_exists()возвращаетfalseя не могу быть уверен, что файл не существует или у меня нет разрешения на файл.
Нет, вы, должно быть, поняли что-то не так. file_exists() вернет TRUE если файл существует, и FALSE если нет. Это не имеет никакого отношения к разрешениям этого файла.
Например, файл, у которого у моего скрипта нет разрешений на чтение, заставит file_exists вернуть TRUE потому что он существует.
Однако, если я тестирую с is_readable в этом файле, он вернет FALSE . У меня нет прав на чтение файла.
Пример:
$file = 'unreadable'; var_dump(file_exists($file), is_readable($file));
Вывод:
bool(true) bool(false)
Изменить. Естественно, это связано с базовыми системными библиотеками, которые использует PHP для получения информации о существовании файлов и разрешениях файлов. Если PHP не может получить статус о существовании файла или нет, он скажет вам, что файл не существует. Это, например, случай, если у вас есть каталог, который существует, но недоступен для пользователя:
$dir = 'unreadable'; $file = $dir.'/unreadable.ext'; var_dump(file_exists($dir), is_readable($dir)); # bool(true) # bool(false) var_dump(file_exists($file), is_readable($file)); # bool(false) # bool(false)
Поскольку вы хотите получить статус существования $file , базовые разрешения не позволяют вам его получить. Поэтому файл для вас не существует. Это одинаково правильно, и вы должны быть более точным, что вам действительно нужно выяснить. Потому что для вас файл не существует. Вот как работают права доступа к каталогам (все примеры запускаются в Windows здесь, но эти вещи являются общими, что у вас есть в каждой общей реализации файловой системы).
Надеюсь, это пролить свет на ваш вопрос.
Я написал функцию, которая проверяет, существует ли файл. Он возвращает false, если в файловой системе нет такого файла, иначе он возвращает true. Моя функция проверяет структуру каталога (снизу вверх). Нужно быть уверенным, что существует каталог $root .
private function fileCanExists($root, $path) { $root .= '/'; if (file_exists($root . $path)) return true; while ($path != '.') { $path = dirname($path); if (file_exists($root . $path)) { if (is_readable($root . $path)) return false; else return true; } } return false; }
Вот что значит, когда я писал:
Я хочу проверить, нет ли файла.
Проверьте с is_readable и если return false, проверьте с помощью file_exists