Verificare se i file sono scrivibili, apribili e chiudibili

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve a tutti avrei bisogno di verificare se 3 file ad es:

file1.php
file2.php
file3.php

In base ad i permessi che hanno, sono apribili modificabili e chiudibili.

Mi spiego bene:

Per ognuno dei tre file php ho questo codice in una paginascrivi.php che eseguita li apre e scrive su di essi in una riga precisa:

PHP:
	$lines4 = file('../../form.php'); 
        $lines4 = str_replace("\n", "", $lines4);
        $lines4[139] = "$('a.add').relCopy({ limit: " . $lallegati . ", append: removeLink});"; 
        file_put_contents('../../form.php', implode("\n", $lines4));
        
        $lines4 = file('../../m.form.php');
        $lines4 = str_replace("\n", "", $lines4);
        $lines4[120] = "$('a.add').relCopy({ limit: " . $lallegati . ", append: removeLink});";
        file_put_contents('../../m.form.php', implode("\n", $lines4));
		
	echo "<p><font color='green'>Successo</font></p>";

Il fatto è che quell'echo "successo" non ha nessun controllo, cioè non so se effettivamente le righe siano scritte o meno, quindi è inutile.

Spulciando php.net ho trovato is_writable e nei commenti ci stava questa funzione un po datata (2004):

PHP:
<?php
    function file_write($filename, &$content) { 
        if (!is_writable($filename)) {
            if (!chmod($filename, 0666)) {
                 echo "Cannot change the mode of file ($filename)";
                 exit;
            };
        }
        if (!$fp = @fopen($filename, "w")) {
            echo "Cannot open file ($filename)";
            exit;
        }
        if (fwrite($fp, $content) === FALSE) {
            echo "Cannot write to file ($filename)";
            exit;
        } 
        if (!fclose($fp)) {
            echo "Cannot close file ($filename)";
            exit;
        }
    } 
?>

Vorrei sapere alcune cose:

1. come funzione è corretta?
2. se non erro si basa sulla lettura del CHMOD, tuttavia non mi sembra una soluzione corretta, è possibile ovviare a questo problema?
3. nel caso, come posso adattarla?
 
Secondo me non ti resta che provarla.
Posso chiederti come mai non ti sembra corretta?
A me lo sembra.
 
Il permesso di apertura e chiusura non esiste. Gli unici permessi che esistono sono: lettura, scrittura ed esecuzione. Quindi se vuoi essere sicuro di poter scrivere su un file basta che verifichi la sua esistenza e il permesso di scrittura:
PHP:
<?php
if (is_file('file.txt') && is_writable('file.txt')) {
    // ...
} else {
    // ...
}
?>
 
Il permesso di apertura e chiusura non esiste. Gli unici permessi che esistono sono: lettura, scrittura ed esecuzione. Quindi se vuoi essere sicuro di poter scrivere su un file basta che verifichi la sua esistenza e il permesso di scrittura:
PHP:
<?php
if (is_file('file.txt') && is_writable('file.txt')) {
    // ...
} else {
    // ...
}
?>

Così in modo semplice semplice? Mi pare che is_file sia superfluo, is_writable dovrebbe verificare anche l'esistenza. No?

Se ho ragione io verrebbe
PHP:
if (is_writable('file.txt')) {
    // scrivo e do messaggio di successo
} else {
    // non posso scrivere quindi errore!
}
?>
 
Ultima modifica:
Puoi fare un doppio controllo per avere un messaggio di errore più preciso.
Cosi puoi indicare che il file non esiste oppure che non ha i permessi per scriverlo.
 
Alla fine ho fatto in questo modo qui

PHP:
	//metto una stringa vuota che in caso di errore riempio dopo
	$scrittura = "";
	
	if (!is_writable('../../form.php')){ 
		$scrittura.="<font color='red'>Errore:</font> Il file form.php non esiste o non è scrivibile, in tal caso cambiare i permessi CHMOD e riprovare.<br />"; 
	}
	if (!is_writable('../../m.form.php')){ 
		$scrittura.="<font color='red'>Errore:</font> Il file m.form.php non esiste o non è scrivibile, in tal caso cambiare i permessi CHMOD e riprovare.<br />"; 
	}
	if (!is_writable('../../php/invio.php')){ 
		$scrittura.="<font color='red'>Errore:</font> Il file /php/invio.php non esiste o non è scrivibile, in tal caso cambiare i permessi CHMOD e riprovare.<br />"; 
	}
	
	//se $errore non è vuoto
	if($scrittura !=""){
		echo $scrittura; //avvisi e 
		echo "<meta http-equiv='Refresh' content='6; URL=../../index.php'>";//torni a home dopo 6 sec 
		exit;
	}else{
	
	
	/***** SCRITTURA DELLE RIGHE *****/
}

Credo vada... spero :P
 

Discussioni simili