PHP: Как проверить, не существует ли файл или разрешено ли разрешение?

Я хочу проверить, нет ли файла. Когда file_exists() возвращает false я не могу быть уверен, что файл не существует или у меня нет разрешения на файл.

Как распознать эти две возможности?

Solutions Collecting From Web of "PHP: Как проверить, не существует ли файл или разрешено ли разрешение?"

Может быть, 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