Manipolare i file

Anche può sembrare anacronistico, è fondamentale conoscere le funzioni per manipolare dei semplici file residenti sul server, con PHP. Molto spesso ci capita di dover realizzare sistemi che hanno bisogno di questa rudimentale – mica tanto, poi – forma di database per immagazzinare i dati. PHP mette a disposizione una serie di funzioni utili a leggere, scrivere e in genere manipolare i file. Nella maggior parte dei casi manipoleremo semplici file di testo, magari organizzati come CSV (valori separati da virgola) oppure avremo il bisogno di creare dei file per cache o altro.

Qualsiasi sia l’esigenza, manipolare un file richiede sempre tre operazioni principali, l’apertura (o creazione del file), la lettura o scrittura su di esso, la chiusura del file.

Aprire un file esistente o crearne uno

La funzione cardine attraverso la quale PHP apre un file o lo crea è fopen(). Nella sua sintassi essenziale, fopen() accetta due parametri: il primo è il nome del file (passato come stringa), mentre il secondo è la modalità, che è un parametro che sostanzialmente dice a PHP come si deve comportare con il file.

Se il file non esiste già, esistono delle modalità che lo creano prima di utilizzarlo. Le modalità fondamentali che possiamo indicare sono:

  • “r” che apre il file in sola lettura e posiziona il puntatore all’inizio del file
  • “r+” che apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file
  • “w” che apre il file sola scrittura e posiziona il puntatore all’inizio del file e tronca il file a lunghezza zero. Se il file non esiste, tenta di crearlo
  • “w+” che apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file e tronca il file a lunghezza zero. Se il file non esiste, tenta di crearlo
  • “a” che apre il file sola scrittura e posiziona il puntatore alla fine del file e tronca il file a lunghezza zero. Se il file non esiste, tenta di crearlo
  • “a+” che apre il file in lettura e scrittura e posiziona il puntatore alla fine del file e tronca il file a lunghezza zero. Se il file non esiste, tenta di crearlo

La funzione fopen() restituisce un collegamento, che dovremo conservare in una variabile per poter effettuare le operazioni successive su quel file aperto:

Nel nostro esempio, tentiamo di aprire il file file.txt in modalità w+, in modalità lettura e scrittura. Se il file non esiste già, verrà creato. A questo punto, nella variabile $c ci sarà il collegamento alla risorsa che utilizzeremo nel prossimo esempio:

Scrivere con fwrite()

A questo punto il nostro file.txt è aperto e pronto per la lettura o scrittura. Il puntatore è posizionato all’inizio del file: tutte le operazioni che faremo partiranno da quel punto. Nell’esempio scriviamo luca nel file: indichiamo semplicemente a fopen() il collegamento $c e cosa scrivere nel file. Questa funzione restituisce un numero intero con la lunghezza dei byte scritti nel file, oppure FALSE. Chiudiamo con la chiamata alla funzione fclose() che chiude il collegamento al file aperto.

Leggere con fread()

La funzione fread() ci permette di leggere una porzione variabile del contenuto del file, o tutto, se desiderato. fread() accetta due parametri: il collegamento alla risorsa $c e la lunghezza in byte del contenuto da leggere.

In questo esempio, leggiamo i primi 1024 byte del file file2.txt e li mettiamo nella variabile $contenuto come stringa. Se invece volessimo leggere tutto il contenuto di un file in una variabile abbiamo due scelte: la prima è usare fread() indicando come secondo parametro la lunghezza totale del file, usando la funzione filesize():

filesize() accetta un solo parametro, il nome del file come stringa, e restituisce un numero con la lunghezza in byte del file.

Leggere tutto il file con file_get_contents()

Il secondo metodo, consigliato perché più performante, è quello di usare la funzione file_get_contents(). Questa funzione accetta come minimo un solo parametro, ovvero una stringa contenente il nome del file, proprio come per fread().

Se per un qualche motivo non sarà possibile leggere il file, la funzione file_get_contents() restituisce FALSE. Nel caso contrario, tutto il contenuto di file3.txt sarà posizionato nella variabile $contenuto.

Scrivere tutto il file con file_put_contents()

Quanto abbiamo appena visto, funziona anche in scrittura: con una sola funzione, file_put_contents() possiamo scrivere in un file con una sola istruzione. Usare file_put_contents() corrisponde ad usare fopen(), fwrite() e fclose() in successione. Questa funzione accetta principalmente due parametri: il nome del file e il contenuto da scrivere.

In questo esempio scriviamo nel file4.txt il contenuto della variabile $a; Nel caso volessimo aggiungere del testo in coda a quanto già presente nel file, dobbiamo indicare il terzo parametro come FILE_APPEND:

Per rendere più sicura la scrittura, potremmo includere una direttiva che esegue il lock del file, cosicché nessuno possa scrivergli contemporaneamente:

Leggere il file in un array

Una interessante possibilità, sicuramente utile per i nostri futuri progetti, è quella offerta dalla funzione file(). Essa, legge l’intero contenuto di un file e lo posiziona in un array con ogni rigo del file corrispondente ad un elemento dell’array.

In questo esempio, leggiamo il contenuto di file5.txt e lo mettiamo in un array. Creiamo poi un ciclo foreach che legge l’array e stampa a schermo ogni riga con numero e contenuto.

Puntatori

Vi sarete accorti che in questo capitolo abbiamo spesso parlato di puntatore. Il puntatore è.. un puntatore. Immaginiamolo come il cursore all’interno di un file di testo: se scriviamo lo vedremo subito dopo la frase, ma potremmo spostarlo con il mouse. Se ricominciassimo a scrivere scriveremmo da quel punto. PHP offre varie funzioni per agire sul puntatore in un file aperto.

Per prima cosa, quando utilizziamo fopen(), a seconda della modalità scelta, il cursore si troverà in una certa posizione: r, r+, w e w+ lo posizionano all’inizio del file, mentre a e a+ alla fine del file. Quando effettueremo un fwrite(), per esempio,  si troverà alla fine del file.

In questo esempio, apriamo il file con fopen(), scriviamo la stringa “prova” con frwite. A questo punto per capire dove si trova il puntatore, usiamo la funzione ftell() per capire che è alla fine di quanto appena scritto. Per spedire il puntatore all’inizio del file, usiamo la funzione rewind(). Se provassimo a scrivere nuovamente, il testo andrà a posizionarsi prima di ogni altro contenuto.

Lavorare con file remoti

Quanto abbiamo appena visto con le funzioni file_get_contents() e file(), funziona anche con i file remoti, se la configurazione di PHP lo permette.

Potremmo cioè leggere un file remoto con file_get_contents() e file() proprio come facciamo per i file in locale residenti sul nostro server.

In questo esempio, abbiamo preso tutto il contenuto HTML della home page di Wikipedia. Lo facciamo anche in quest’altro esempio, con la funzione file():

Copiare, rinominare, cancellare

Chiudiamo questa lezione con le funzioni basi per manipolare non il contenuto, ma i file stessi. Sarà fondamentale rinominare, copiare o cancellare un file dal server quando necessario:

Le funzioni copy(), rename() e unlink() restituiscono un valore TRUE o FALSE in caso di fallimento. In questo esempio abbiamo usato anche la funzione file_exists() che accetta come parametro un nome del file e, se questo esiste, restituisce TRUE, altrimenti FALSE.