Question

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

La fonction est_écritable doesn ' t fonctionne pour les dossiers. (edit: Cela fonctionne. Voir la réponse acceptée.)

Était-ce utile?

La solution

Oui, cela fonctionne pour les dossiers ....

  

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

Autres conseils

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
}

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

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

paix ...

Vous envoyez peut-être un chemin d'accès complet à la fonction is_writable () . is_writable () renverra 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 $ fichier contient votre chemin d'accès, procédez comme suit:

$file_directory = dirname($file);

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

J'espère que cela aide quelqu'un.

Selon la la documentation relative à is_writable , elle devrait il suffit de travailler - mais vous avez dit "dossier", ce pourrait donc être un problème Windows . Les commentaires suggèrent une solution de contournement .

(Une lecture hâtive faite plus tôt m'a fait penser que les barres obliques étaient importantes, mais que cela s'est avéré être spécifique à ce travail).

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 inscriptible ou non. J'espère que cela vous aidera.

<?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 ()

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

http://us2.php.net/stat

Selon le manuel PHP, is_writable devrait fonctionner correctement pour les répertoires.

voici comment je le fais:

créez un fichier avec file_put_contents () et vérifiez la valeur de retour, si elle est positive (nombre d'écritures en octets), vous pouvez alors continuer et faire ce que vous avez à faire, le cas échéant. FALSE alors ce 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');

Dans mon cas, is_writable a renvoyé la valeur true, mais une tentative d’écriture du fichier a généré une erreur.
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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top