Corso PHP: 19 – Leggere e scrivere files (Parte 3^)

Scrivere un file.

Vediamo ora come si può scrivere in un file usando PHP.

Naturalmente prima di poter operare su un file bisogna che questo sia stato aperto e per poterlo scrivere deve essere aperto in scrittura. Ricordiamo quindi i metodi di apertura che abilitano alla scrittura di un file anche se già visti precedentemente:

➬ ‘r+‘:  Apre in lettura e scrittura; posiziona il puntatore all’inizio del file.

➬ ‘w‘:  Apre il file in sola scrittura; posiziona il puntatore all’inizio del file e tronca il file alla lunghezza zero. Se il file non esiste, tenta di crearlo.

➬ ‘w+’:  Apre in lettura e scrittura; posiziona il puntatore all’inizio del file e tronca il file alla lunghezza zero. Se il file non esiste, tenta di crearlo.

➬ ‘a‘:  Apre in sola scrittura; posiziona il puntatore alla fine del file. Se il file non esiste, tenta di crearlo.

➬ ‘a+‘:  Apre in lettura e scrittura; posiziona il puntatore alla fine del file. Se il file non esiste, tenta di crearlo.

➬ ‘x‘:  Crea ed apre il file in sola scrittura; posiziona il puntatore all’inizio del file. Se il file esiste già la chiamata a fopen() fallirà restituendo FALSE e verrà generato un errore di lievllo E_WARNING.

➬ ‘x+‘:  Crea ed apre il file in lettura e scrittura; posiziona il puntatore all’inizio del file. Se il file esiste già la chiamata a fopen() fallirà restituendo FALSE e verrà generato un errore di lievllo E_WARNING.

Per scrivere si usa la funzione fwrite() che ha la seguente sintassi:

int fwrite (resource $handle, string $string [, int $length ])

 

 

$handle è il puntatore al file che deve essere stato precedentemente aperto, mentre $string è ovviamente la stringa che deve essere scritta.

Se l’argomento $length è specificato la scrittura si arresterà dopo aver scritto $length bytes oppure alla fine di $string se è lunga meno di $length.

Vediamo alcuni esempi:

Esempio 1 – Creazione di un file:

 

<?
$f = fopen("dati.txt", "w"); // lo apre e lo svuota. se non esiste lo crea
if ($f) {
   if (fwrite($f, $contenuto) === FALSE) { //$contenuto contiene il testo che devo scrivere
      echo "Non si riesce a scrivere nel file";
      exit;
   }
   fclose($f);
}
else echo "Errore durante l’apertura del file dati.txt";
?>

Esempio 2 – Aggiunta di testo in un file:

 

<?
$f = fopen("dati.txt", "a"); // apre il file in append
$contenuto = "Nuova riga di testo da aggiungere";
if (!is_writable("dati.txt")) {
   echo "Non si può accedere al file";
   exit;
}
if ($f) {
   if (!fwrite($f, $contenuto)) {
      echo "Non si riesce a scrivere nel file";
      exit;
   }
   fclose($f);
}
else echo "Errore durante l’apertura del file dati.txt";
?>

In questo secondo esempio potevamo semplicemente sostituire “a” alla “w” nella funzione fopen(), ma abbiamo voluto scrivere il tutto in maniera leggermente diversa usando per esempio la funzione is_writable() per verificare se il file può essere scritto. Questa ed altre funzioni utili nella gestione del file system saranno discusse successivamente a questo capitolo.

Importante:

Quando si scrive un file con un programma web occorre tener presente che possono esserci diversi utenti che eseguono operazioni di scrittura simultaneamente. Se questo accade il file può rovinarsi. Ma anche se c’è un utente che scrive nel file contemporaneamente ad uno che legge dallo stesso file possono esserci problemi per quello che legge che riceve dati errati.

Per ovviare a questo, usando file tradizionali, bisogna ricorrere alla funzione flock().  Questa funzione ha l’effetto di bloccare l’accesso al file da parte di altri utenti , mettendo in coda tutte le altre richieste di accesso.

La sintassi di questa funzione è la seguente:

bool flock (resource $handle, int $operation [, int &$wouldblock ])

$handle è il puntatore al file che deve essere stato precedentemente aperto.

$operation può assumere uno dei valori seguenti:

  • LOCK_SH che si usa in lettura per permettere una condivisione solo per accessi in lettura;
  • LOCK_EX usato in fase di scrittura per bloccare un file;
  • LOCK_UN che va usato per sbloccare il file;
  • LOCK_NB va aggiunto se non si vuole che flock() attenda lo sblocco nel caso che il file sia già bloccato.

Quindi LOCK_NB può essere aggiunto agli altri parametri per prevenire il fatto che fblock() resti in attesa di uno sblocco eventuale, come mostrato nell’esempio che segue:

 

<?php
$fp = fopen("file.txt", "w+");
$contenuto = "Riga da aggiungere al mio file";
flock($fp, LOCK_EX + LOCK_NB); // Esegue un lock esclusivo
fwrite($fp, $contenuto);
flock($fp, LOCK_UN + LOCK_NB); // sblocca il file
fclose($fp);
?>

Cancellare un file.

Per cancellare un file usando PHP si deve ricorrere alla funzione unlink() che ha la seguente sintassi:

bool unlink (string $filename)

Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Se il file non esiste genera un warning. Per evitarlo verificare che il file esista con la funzione file_exists.

Esempio

 

<?php
$file = "miofile.txt";
if (file_exists ()) {
   if (!unlink($file)) echo "Il file '".$file."' non può essere cancellato";
}
else echo "Il file '".$file."' non esiste";
?>

 

Copiare un file.

Per copiare un file usando PHP si deve ricorrere alla funzione copy() che ha la seguente sintassi:

bool copy (string $source, string $dest)

Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Esempio:

 

<?php
$file = "miofile.txt";
$newfile = "miofile.old";
if (!copy($file, $newfile)) echo "Copia di $file non riuscita";
?>

 

Spostare o rinominare un file.

Per spostare un file si deve utilizzare la funzione rename() esattamente come per rinominarlo.

La sintassi è la seguente:

bool rename (string $oldname, string $newname)

L’unica differenza tra rename e move starà nel fatto che in $newname si metta un percorso differente davanti al nome del nuovo file. Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Esempio:

 

<?php
$oldfile = "miofile.txt";
$newfile = "NuovoPercorso/miofile2.txt";
if (!rename($oldfile, $newfile)) echo "$file non spostato";
?>

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *