PHP: Как проверить, если файл не существует или разрешение запрещено? - PullRequest
3 голосов
/ 11 марта 2012

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

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

Ответы [ 5 ]

1 голос
/ 11 марта 2012

Я написал функцию, которая проверяет, существует ли файл. Он возвращает 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;
}

Вот что значит, когда я написал:

Я хочу проверить, не существует ли файл.

1 голос
/ 11 марта 2012

Я хочу проверить, не существует ли файл. Когда функция 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, базовые разрешения не позволяют вам его получить. Поэтому файл не существует для вас. Это в равной степени правильно, и вы должны быть более точными, что вам действительно нужно выяснить. Потому что для вас файл не существует. Вот как работают разрешения на доступ к каталогам (здесь все примеры запускаются на окнах, но эти вещи настолько распространены, что они есть в каждой обычной реализации файловой системы).

Надеюсь, это проливает свет на вашу проблему.

1 голос
/ 11 марта 2012

Ну, вы можете сначала попробовать file_exists ().В случае неудачи вы можете попробовать fopen () с флагом + a.Если это не помогло, у вас нет разрешения.

1 голос
/ 11 марта 2012

Может быть is_readable это то, что вы хотите?

0 голосов
/ 11 марта 2012

Проверьте с помощью is_readable и, если вернет false, проверьте с помощью file_exists

...