Come posso verificare se una directory è scrivibile in PHP?
-
01-07-2019 - |
Domanda
Qualcuno sa come posso verificare se una directory è scrivibile in PHP?
La funzione is_writable
doesn ' t funziona per le cartelle. (modifica: funziona. Vedi la risposta accettata.)
Soluzione
Sì, funziona per le cartelle ....
Restituisce VERO se il nome file esiste ed è scrivibile. L'argomento del nome file può essere un nome di directory che consente di verificare se una directory è scrivibile.
Altri suggerimenti
questo è il codice :)
<?php
$newFileName = '/var/www/your/file.txt';
if ( ! is_writable(dirname($newFileName))) {
echo dirname($newFileName) . ' must writable!!!';
} else {
// blah blah blah
}
per essere più specifici per proprietario / gruppo / mondo
$dir_writable = substr(sprintf('%o', fileperms($folder)), -4) == "0774" ? "true" : "false";
pace ...
È possibile che tu stia inviando un percorso file completo alla funzione is_writable ()
. is_writable ()
restituirà false se il file non esiste già nella directory. È necessario controllare la directory stessa con il nome file rimosso, se questo è il caso. Se lo fai, is_writable
ti dirà correttamente se la directory è scrivibile o meno. Se $ file
contiene il percorso del file, procedere come segue:
$file_directory = dirname($file);
Quindi usa is_writable ($ file_directory)
per determinare se la cartella è scrivibile.
Spero che questo aiuti qualcuno.
Secondo la documentazione per is_writable , dovrebbe funziona, ma hai detto " cartella " ;, quindi questo potrebbe essere un problema di Windows . I commenti suggeriscono una soluzione alternativa .
(Una lettura affrettata in precedenza mi ha fatto pensare che le barre finali fossero importanti, ma si è rivelato essere specifico per questo lavoro in giro).
Ho scritto un piccolo script (lo chiamo isWritable.php ) che rileva tutte le directory nella stessa directory in cui si trova lo script e scrive sulla pagina se ogni directory è scrivibile o meno. Spero che questo aiuti.
<?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 ()
Proprio come una stat di sistema, ma in PHP. Quello che vuoi controllare è il valore della modalità, proprio come faresti con qualsiasi altra chiamata a stat in altre lingue (I.E. C / C ++).
Secondo il manuale di PHP is_writable dovrebbe funzionare bene su directory.
ecco come lo faccio:
crea un file con file_put_contents ()
e controlla il valore di ritorno, se è positivo (numero di scritti in byte), puoi andare avanti e fare quello che devi fare, se lo è FALSO quindi non è scrivibile
$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";
quindi è possibile eliminare il file fittizio utilizzando unlink ()
unlink('directory/dummy.txt');
Nel mio caso, is_writable
è tornato vero, ma quando si è tentato di scrivere il file è stato generato un errore.
Questo codice aiuta a verificare se $ dir
esiste ed è scrivibile:
<?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);
}
}