





Да, с папками работает ....
Returns TRUE if the filename exists and is writable. The filename argument may be a directory name allowing you to check if a directory is writable.
Согласно руководству по PHP, is_writable должен нормально работать с каталогами.
Согласно документация для is_writable, это должно просто работать - но вы сказали «папка», так что это может быть проблема с Windows. В комментариях предлагается обходной путь.
(Быстрое прочтение ранее заставило меня подумать, что конечные косые черты важны, но это оказалось специфическим для этой работы).
stat ()
Очень похоже на системную статистику, но на PHP. Что вы хотите проверить, так это значение режима, как и при любом другом вызове stat на других языках (например, C / C++).
Возможно, вы отправляете полный путь к файлу функции is_writable(). is_writable() вернет false, если файл еще не существует в каталоге. Вам нужно проверить сам каталог с удаленным именем файла, если это так. Если вы это сделаете, is_writable правильно сообщит вам, доступен ли каталог для записи или нет. Если $file содержит путь к вашему файлу, сделайте следующее:
$file_directory = dirname($file);
Затем используйте is_writable($file_directory), чтобы определить, доступна ли папка для записи.
Я надеюсь, что это помогает кому-то.
это код :)
<?php
$newFileName = '/var/www/your/file.txt';
if ( ! is_writable(dirname($newFileName))) {
echo dirname($newFileName) . ' must writable!!!';
} else {
// blah blah blah
}
Ах, dirname($new_file_name), это проще, чем то, что я собирался сделать. Я собирался использовать pathinfo($new_file_name,PATHINFO_DIRNAME). Спасибо.
чтобы быть более конкретным для владельца / группы / мира
$dir_writable = substr(sprintf('%o', fileperms($folder)), -4) == "0774" ? "true" : "false";
мир...
Эта функция должна быть улучшена. Сейчас он вернет false для таких разрешений, как 0777.
вот как я это делаю:
создайте файл с file_put_contents() и проверьте возвращаемое значение, если оно положительное (количество записанных в байтах), вы можете продолжить и сделать то, что вам нужно сделать, если оно FALSE, то оно не доступно для записи
$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>';
}
}
?>
вы можете использовать $ dirs = glob ('*', GLOB_ONLYDIR);
В моем случае 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);
}
}
Хитрость в том, что вы не можете указать файл, который еще не существует в папке, которую вы действительно хотите протестировать - просто укажите папку.