Pregunta

¿Alguien sabe cómo puedo verificar si un directorio se puede escribir en PHP?

La función is_writable No funciona para carpetas.(editar:Funciona.Vea la respuesta aceptada).

¿Fue útil?

Solución

Sí, funciona para carpetas...

Devuelve VERDADERO si el nombre del archivo existe y se puede escribir.El argumento del nombre de archivo puede ser un nombre de directorio que le permita verificar si se puede escribir en un directorio.

Otros consejos

este es el codigo :)

<?php 

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

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

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

    // blah blah blah
}

para ser más específico para propietario/grupo/mundo

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

paz...

Es posible que esté enviando una ruta de archivo completa al is_writable() función. is_writable() devolverá falso si el archivo aún no existe en el directorio.Debe verificar el directorio en sí sin el nombre del archivo, si este es el caso.Si haces eso, is_writable le dirá correctamente si se puede escribir en el directorio o no.Si $file contiene la ruta de su archivo, haga esto:

$file_directory = dirname($file);

Entonces usa is_writable($file_directory) para determinar si se puede escribir en la carpeta.

Espero que esto ayude a alguien.

De acuerdo a la documentación para is_writable, debería funcionar, pero dijiste "carpeta", por lo que esto podría ser un problema de Windows.Los comentarios sugieren una solución.

(Una lectura apresurada anterior me hizo pensar que las barras diagonales eran importantes, pero resultó ser específico de esta solución).

He escrito un pequeño guión (lo llamo esEscribible.php) que detecta todos los directorios en el mismo directorio en el que se encuentra el script y escribe en la página, ya sea que se pueda escribir en cada directorio o no.Espero que esto ayude.

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

estadística()

Muy parecido a una estadística del sistema, pero en PHP.Lo que desea verificar es el valor del modo, al igual que lo haría con cualquier otra llamada a estadísticas en otros idiomas (es decir,C/C++).

http://us2.php.net/stat

Según el manual de PHP es_escribible debería funcionar bien en directorios.

así es como lo hago:

crear un archivo con file_put_contents() y verifique el valor de retorno, si es positivo (número de bytes escritos), entonces puede continuar y hacer lo que tiene que hacer, si es FALSO entonces no se puede escribir

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

luego puedes eliminar el archivo ficticio usando unlink()

unlink('directory/dummy.txt');

En mi caso, is_writable devolvió verdadero, pero cuando intenté escribir el archivo, se generó un error.
Este código ayuda a comprobar si el $dir existe y se puede escribir:

<?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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top