Как проверить, доступен ли каталог для записи в PHP?
кто-нибудь знает, как я могу проверить, можно ли записать каталог в PHP?
функции is_writable
не работает для папок. (edit: это действительно работает. См. принятый ответ.)
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++).
согласно руководству 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>'; } } ?>