Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestire le directories con php

I comandi specifici per lavorare con le directories
I comandi specifici per lavorare con le directories
Link copiato negli appunti

Introduzione

PHP mette a disposizione un limitato, ma pressochè completo, numero di funzioni per "maneggiare" ed
interagire con le directory in modo semplice ed efficace.

Scopo di questo articolo è analizzare una per una queste funzioni (più alcune altre che si trovano nella sezione "funzioni sul filesystem") e costruire due sistemi alternativi (e parimenti efficaci) per "scorrere" ed eventualmente manipolare il contenuto di una directory.

Anticipo subito che i link di riferimento, sul manuale ufficiale, sono
questo
(la sezione del manuale dedicata alle directory), e
questo per le altre
(la sezione dedicata alla gestione del filesystem).

Le funzioni dedicate

Iniziamo subito ad analizzare le funzioni dedicate specificamente alle directory:

opendir() come suggerisce il nome,
serve per "aprire" una directory, analogamente a quanto fanno le funzioni che
lavorano con i files.
Restituisce un handle (una variabile del tipo "risorsa", sui tipi delle variabili si può
leggere l'articolo sulle Variabili e tipi in Php ), da
utilizzare con le altre apposite funzioni che vedremo immediatamente, o false in caso di
errore. Accetta un solo parametro, la stringa con il percorso della directory da aprire.

closedir() chiude, come è facile intuire, la directory precedentemente aperta con opendir() (funzione di cui è quindi
complementare) ed accetta un solo parametro, ossia l'handle restituito da opendir(). Da notare che la funzione non
restituisce alcun valore (void).

readdir() questa funzione è utilizzata
per leggere il contenuto di una directory precedentemente aperta da opendir().
Come avviene per i files e per gli array, anche questa funzione utilizza un puntatore che, inizialmente, punta al
primo elemento contenuto nella directory aperta, (secondo l'ordine cui tali elementi sono memorizzati nel filesystem
e sempre che esistano, ovviamente) restituendolo sotto forma di stringa , e si sposta quindi all'elemento successivo
(per questa ragione si usa, solitamente all'interno di un ciclo).
Prende come parametro l'handle restituito da opendir() e, nota bene, restituisce anche gli elementi contrassegnati con
. (la directory corrente) e .. (la directory immediatamente superiore) contenuti in ogni directory, che vanno pertanto esplicitamente esclusi nel caso in cui si voglia scorrere ed analizzarne il contenuto (come vedremo fra breve).

rewinddir() questa funzione è utilizzata per "riavvolgere" il puntatore interno di PHP, ossia per riportarlo al primo
elemento. Prende come parametro l'handle resituito da opendir().
Da notare che la funzione non restituisce alcun valore (void).

chdir() questa funzione serve a cambiare
la directory corrente usata da PHP e resituisce TRUE o FALSE a seconda dell'esito dell'operazione.

getcwd() restituisce come stringa la
directory di lavoro (Current Working Directory) attualmente in uso.

dir() questa non è una vera funzione, ma un "meccanismo pseudo orientato agli oggetti" (per usare la terminologia
del manuale ufficiale di PHP), per lavorare con le directory e alternativo a quello classico, ma a questo pressoché identico, per cui usare l'uno o l'altro diventa quasi una pure questione di stile.
Alla chiamata di dir(), viene aperta la directory specificata come argomento e viene istanziato un oggetto; a questo punto avremo a disposizione un puntatore (handle) e tre metodi, read, rewind e close, in tutto e per tutto identici alle analoghe funzioni precedentemente illustrate.

Le funzioni sul filesystem

Analizziamo adesso altre importanti funzioni per le directory che il manuale ufficiale annovera fra le "funzioni sul
Filesystem":

mkdir() funzione utilizzata per
(tentare di) creare una directory, accetta due parametri, la directory da creare (con
il relativo percorso, ovviamente) e il mode, ossia i permessi della nuova directory (generalmente espressi in ottale),
che sono peraltro influenzati dall'umask corrente e che pertanto possono essere settai al volo con la funzione
umask(), sulla quale peraltro non è il caso di soffermarsi oltre, perchè non funzionante sui sistemi windows.
La funzione restituisce TRUE o FALSE a seconda che la creazione della directory sia andata o meno a buon fine.

rmdir() funzione utilizzata per
(tentare di) rimuovere una directory, a condizione che sia vuota e che i suoi permessi
lo consentano (sui permessi e la loro gestione, si veda questo articolo).
La funzione restituisce TRUE o FALSE a seconda che la rimozione della directory sia andata o meno a buon fine.

is_dir() restituisce TRUE o FALSE a
seconda che il filename passatole come parametro, sia o meno una directory.
Come avverte il manuale, la funzione lavora solo con i file accessibili tramite il filesystem del server e non con i
file remoti.

dirname() dato un determinato
percorso (passato alla funzione come unico parametro), questa funzione estrae e restituisce, da questo,
il nome della directory, ad esempio dirname("/home/web/website/index.php") restituirà "/home/web/website".

Lavorare con le directory

Dopo aver sommariamente analizzato le funzioni che PHP ci mette a disposizione per la gestione delle directory, cercheremo adesso di mettere a punto due sistemi per poter "scorrere" il contenuto di una directory al fine di lavorare in qualche modo con il suo contenuto.

Il primo metodo, che potremmo definire classico, farà uso delle funzioni opendir(), reddir() e closedir(), nel secondo invece useremo la classe dir():

Primo metodo

<?php

// percorso della directory da leggere
$directory = "test";

// apriamo la directory
$open_handle = opendir($directory);

// impostiamo un ciclo while() per scorrere tutto il contenuto
while($read = readdir($open_handle)) {

// escludiamo . e ..

if($read != "." && $read != "..") {

// in questo esempio stampiamo a video i nomi di file e directory
echo $read . "<br>n";

}
}

// chiudiamo la directory
closedir($open_handle);

?>

Secondo metodo

<?php

// percorso della directory da leggere
$directory = "test";

// instanziamo l'oggetto e apriamo la directory
$d = dir($directory);

// impostiamo un ciclo while() per scorrere tutto il contenuto
while ($read = $d->read()) {

// escludiamo . e ..

if($read != "." && $read != "..") {

// in questo esempio stampiamo a video i nomi di file e directory
echo $read . "<br>n";

}

}

// chiudiamo la directory
$d->close();

?>

I due sistemi, come detto, sono identici nella sostanza e la scelta fra l'uno o l'altro è una questione soggettiva; io, ad esempio, preferisco il secondo, quello che usa gli oggetti, ma solo perchè ho sempre usato quello e sono un abitudinario.

Riguardo al codice, i commenti dovrebbero essere sufficienti, aggiungo solo che all'interno del ciclo
while(), si
possono fare, come è ovvio, operazioni ben più complesse della semplice visualizzazione, ad esempio, per dirne una, avvalersi delle funzioni is_file() e is_dir() al fine di distinguere fra files e directory (ed eventualmente contarli).

Ti consigliamo anche