Pergunta

Alguém sabe como posso verificar se um diretório é gravável em PHP?

A função is_writable não funciona para pastas. (Edit:.. Ele faz o trabalho Veja a resposta aceita)

Foi útil?

Solução

Sim, ela não funciona para pastas ....

Retorna TRUE se existe o nome do arquivo e é gravável. O argumento filename pode ser um nome de diretório que lhe permite verificar se um diretório é gravável.

Outras dicas

este é o código:)

<?php 

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

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

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

    // blah blah blah
}

para ser mais específico para o dono / grupo / world

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

paz ...

Você pode estar enviando um caminho de arquivo completo para a função is_writable(). is_writable() retornará false se o arquivo ainda não existir no diretório. Você precisa verificar-se o diretório com o nome do arquivo removido, se este for o caso. Se você fizer isso, is_writable vai corretamente dizer se o diretório é gravável ou não. Se $file contém o caminho do arquivo de fazer isso:

$file_directory = dirname($file);

Em seguida, use is_writable($file_directory) para determinar se a pasta é gravável.

Espero que isso ajude alguém.

De acordo com a a documentação para is_writable, que deveria apenas trabalho - mas você disse "pasta", então isso poderia ser um Windows problema . Os comentários sugerem uma solução .

(A correram lendo antes me fez pensar que barra ao final foram importantes, mas que acabou por ser específico para este trabalho ao redor).

Eu escrevi um pequeno script (eu chamo de isWritable.php ) que detecta todos os diretórios no mesmo diretório que o script é em e escreve para a página se cada diretório é gravável ou não. Espero que isso ajude.

<?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>';
    } 
}
?>

stat ()

Muito parecido com um status do sistema, mas em PHP. O que você quer fazer é verificar o valor modo, muito como se fosse de qualquer outra chamada para status em outros idiomas (ou seja, C / C ++).

http://us2.php.net/stat

De acordo com o PHP Manual is_writable deve funcionar bem em diretórios.

este é como eu faço isso:

criar um arquivo com file_put_contents() e verificar o valor de retorno, se for positivo (número de escritas em Bytes), então você pode ir em frente e fazer o que tem que fazer, se for falsa, então não é gravável

$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";

, em seguida, você pode excluir o arquivo fictício usando unlink ()

unlink('directory/dummy.txt');

No meu caso, is_writable voltou verdade, mas quando tentou gravar o arquivo - um erro foi gerado
. Este código ajuda a verificar se existe a $dir e é gravável:

<?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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top