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

56

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

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

Ваш Ответ

10   ответов
6

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

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

мир ...

Error: User Rate Limit Exceeded0777.
17

это код :)

<?php 

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

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

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

    // blah blah blah
}
Error: User Rate Limit Exceededdirname($new_file_name)Error: User Rate Limit Exceededpathinfo($new_file_name,PATHINFO_DIRNAME)Error: User Rate Limit Exceeded
2

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

стат ()

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

http://us2.php.net/stat

1

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

создать файл с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');
Error: User Rate Limit ExceededmuchError: User Rate Limit Exceeded
5

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

$file_directory = dirname($file);

Тогда используйтеis_writable($file_directory) определить, доступна ли папка для записи.

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

88

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

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.

Error: User Rate Limit ExceededfileError: User Rate Limit Exceeded
0

В моем случае,is_writable вернул true, но при попытке записать файл - была сгенерирована ошибка.
Этот код помогает проверить,$dir существует и доступен для записи:

<?php
$dir = '/path/to/the/dir';

$booExists     = is_dir($dir) || (mkdir($dir, 0774, true) && is_dir($dir));
$booIsWritable = false;
if ($booExists) {
    $tempFile = tempnam($dir, 'tmp');
    if ($tempFile !== false) {
        $res = file_put_contents($tempFile, 'test');

        $booIsWritable = $res !== false;
        @unlink($tempFile);
    }
}
4

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

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

1

Согласно руководству по PHPis_writable должен хорошо работать на каталогах.

Похожие вопросы