web-dev-qa-db-fra.com

Comment vérifier si un répertoire est accessible en écriture en PHP?

Est-ce que quelqu'un sait comment je peux vérifier si un répertoire est accessible en écriture en PHP?

La fonction is_writable ne fonctionne pas pour les dossiers. (modifier: Cela fonctionne. Voir la réponse acceptée.)

58
SeanDowney

Oui, cela fonctionne pour les dossiers ....

Renvoie TRUE si le nom de fichier existe et est accessible en écriture. L'argument nom de fichier peut être un nom de répertoire vous permettant de vérifier si un répertoire est accessible en écriture.

91
DGM

c'est le code :)

<?php 

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

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

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

    // blah blah blah
}
18
Irfan EVRENS

être plus spécifique pour le propriétaire/groupe/monde

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

paix...

6
Griffith

Vous pouvez envoyer un chemin de fichier complet à la fonction is_writable(). is_writable() retournera false si le fichier n'existe pas déjà dans le répertoire. Vous devez vérifier le répertoire lui-même avec le nom de fichier supprimé, si c'est le cas. Si vous faites cela, is_writable Vous indiquera correctement si le répertoire est accessible en écriture ou non. Si $file Contient votre chemin de fichier, procédez comme suit:

$file_directory = dirname($file);

Utilisez ensuite is_writable($file_directory) pour déterminer si le dossier est accessible en écriture.

J'espère que ça aidera quelqu'un.

5
user189249

Selon la documentation pour is_writable , cela devrait juste fonctionner - mais vous avez dit "dossier", donc cela pourrait être n problème Windows . Les commentaires suggèrent ne solution de contournement .

(Une lecture précipitée plus tôt m'a fait penser que les barres obliques de fin étaient importantes, mais cela s'est avéré être spécifique à ce travail).

4
Quentin

J'ai écrit un petit script (je l'appelle isWritable.php) qui détecte tous les répertoires du même répertoire dans lequel se trouve le script et écrit sur la page si chaque répertoire est accessible en écriture ou non. J'espère que cela t'aides.

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

stat ()

Un peu comme une statistique système, mais en PHP. Ce que vous voulez vérifier, c'est la valeur du mode, tout comme vous le feriez pour tout autre appel à stat dans d'autres langues (I.E. C/C++).

http://us2.php.net/stat

2
Jason Mock

Dans mon cas, is_writable a renvoyé true, mais lors de la tentative d'écriture du fichier - une erreur a été générée.
Ce code permet de vérifier si le $dir existe et est accessible en écriture:

<?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);
    }
}
1
Andron

voici comment je le fais:

créer un fichier avec file_put_contents() et vérifier la valeur de retour, si elle est positive (nombre d'écrit en octets) alors vous pouvez continuer et faire ce que vous avez à faire, si elle est FAUX alors elle n'est pas accessible en écriture

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

alors vous pouvez supprimer le fichier factice en utilisant unlink ()

unlink('directory/dummy.txt');
1
Nassim

Selon le PHP manual is_writable devrait fonctionner correctement sur les répertoires.

1
Lasar