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

StackOverflow https://stackoverflow.com/questions/109188

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

это код :)

<?php 

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

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

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

    // blah blah blah
}

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

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

мир...

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

$file_directory = dirname($file);

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

Я надеюсь, что это помогает кому-то.

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

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

Я написал небольшой сценарий (я называю его 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>';
    } 
}
?>

статистика()

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

http://us2.php.net/stat

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

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

создать файл с 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');

В моем случае, 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top