Как проверить, доступен ли каталог для записи в PHP? - PullRequest
58 голосов
/ 21 сентября 2008

Кто-нибудь знает, как я могу проверить, доступен ли каталог для записи в PHP?

Функция is_writable не работает для папок. (редактировать: это работает. См. принятый ответ.)

Ответы [ 10 ]

90 голосов
/ 21 сентября 2008

Да, он работает для папок ....

Возвращает TRUE, если имя файла существует и доступно для записи. Аргумент имени файла может быть именем каталога, позволяющим вам проверить, доступен ли каталог для записи.

17 голосов
/ 24 сентября 2010

это код:)

<?php 

$newFileName = '/var/www/your/file.txt';

if ( ! is_writable(dirname($newFileName))) {

    echo dirname($newFileName) . ' must writable!!!';
} else {

    // blah blah blah
}
6 голосов
/ 25 мая 2011

чтобы быть более конкретным для владельца / группы / мира

$dir_writable = substr(sprintf('%o', fileperms($folder)), -4) == "0774" ? "true" : "false";

мир ...

5 голосов
/ 13 октября 2009

Возможно, вы отправляете полный путь к файлу для функции is_writable(). is_writable() вернет false, если файл еще не существует в каталоге. Вам нужно проверить сам каталог с удаленным именем файла, если это так. Если вы сделаете это, is_writable правильно сообщит вам, доступен ли каталог для записи или нет. Если $file содержит ваш путь к файлу, сделайте это:

$file_directory = dirname($file);

Затем используйте is_writable($file_directory), чтобы определить, доступна ли папка для записи.

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 21 сентября 2008

Согласно документации для is_writable , она должна просто работать - но вы сказали "папка", так что это может быть проблема Windows . Комментарии предлагают обходной путь .

(Быстрое чтение ранее заставило меня думать, что конечные слэши были важны, но это оказалось специфичным для этой работы).

3 голосов
/ 10 августа 2017

Я написал небольшой скрипт (я называю его isWritable.php ), который обнаруживает все каталоги в том же каталоге, в котором находится скрипт, и записывает на страницу, доступен ли для записи каждый каталог или нет. Надеюсь, это поможет.

<?php
// isWritable.php detects all directories in the same directory the script is in
// and writes to the page whether each directory is writable or not.

$dirs = array_filter(glob('*'), 'is_dir');

foreach ($dirs as $dir) {
    if (is_writable($dir)) {
        echo $dir.' is writable.<br>';
    } else {
        echo $dir.' is not writable. Permissions may have to be adjusted.<br>';
    } 
}
?>
2 голосов
/ 21 сентября 2008

стат ()

Очень похоже на системную статистику, но в PHP. То, что вы хотите проверить, это значение режима, так же, как и при любом другом вызове stat на других языках (например, C / C ++).

http://us2.php.net/stat

1 голос
/ 07 марта 2019

В моем случае is_writable вернул true, но при попытке записать файл - возникла ошибка.
Этот код помогает проверить, существует ли $dir и доступен ли для записи:

<?php
$dir = '/path/to/the/dir';

// try to create this directory if it doesn't exist
$booExists     = is_dir($dir) || (mkdir($dir, 0774, true) && is_dir($dir));
$booIsWritable = false;
if ($booExists && is_writable($dir)) {
    $tempFile = tempnam($dir, 'tmp');
    if ($tempFile !== false) {
        $res = file_put_contents($tempFile, 'test');

        $booIsWritable = $res !== false;
        @unlink($tempFile);
    }
}
1 голос
/ 16 июня 2015

вот как я это делаю:

создайте файл с file_put_contents() и проверьте возвращаемое значение, если оно положительное (число записано в байтах), тогда вы можете пойти дальше и сделать то, что вам нужно сделать, если это ЛОЖЬ, тогда он не доступен для записи

$is_writable = file_put_contents('directory/dummy.txt', "hello");

if ($is_writable > 0) echo "yes directory it is writable";

else echo  "NO directory it is not writable";

, затем вы можете удалить фиктивный файл, используя unlink ()

unlink('directory/dummy.txt');
1 голос
/ 21 сентября 2008

Согласно руководству по PHP is_writable должно нормально работать с каталогами.

...