Я хочу проверить, нет ли файла. Когда 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