Кто-нибудь знает, как я могу проверить, можно ли писать каталог на PHP?
Функция is_writable
не работает для папок. (edit: он работает. См. принятый ответ.)
Кто-нибудь знает, как я могу проверить, можно ли писать каталог на PHP?
Функция is_writable
не работает для папок. (edit: он работает. См. принятый ответ.)
Да, он работает для папок....
Возвращает 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. В комментариях предлагается обходной путь.
(Быстрое чтение ранее заставило меня думать, что трейлинг-косые черты важны, но это оказалось специфичным для этой работы).
Вы можете отправить полный путь к файлу функции is_writable()
. is_writable()
вернет false, если файл еще не существует в каталоге. Вам нужно проверить сам каталог с удалением имени файла, если это так. Если вы это сделаете, is_writable
будет правильно указывать, является ли каталог доступным для записи или нет. Если $file
содержит ваш путь к файлу, выполните следующие действия:
$file_directory = dirname($file);
Затем используйте is_writable($file_directory)
, чтобы определить, доступна ли папка для записи.
Я надеюсь, что это поможет кому-то.
стат()
Как системный stat, но в PHP. То, что вы хотите проверить, - это значение режима, как и любой другой вызов stat на других языках (I.E.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');
Я написал немного script (я называю его isWritable.php), который обнаруживает все каталоги в том же каталоге, в котором находится script, и записывает на страницу, доступен ли каждый каталог для записи или нет. Надеюсь, это поможет.
<?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>';
}
}
?>