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


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

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

9 54

9 ответов:

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

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

этот код :)

<?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, он должен просто работать - но вы сказали "папка", так что это может быть проблема с Windows. Комментарии предлагают решение.

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

stat ()

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

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');

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