Ecco qui la mia seconda pillola,
ho notato che un problema che ritorna spesso ma che poche volte viene risolto è la lettura di directory.
Mi sono documentato e francamente mi è sembrato talmente facile farlo che quasi pensavo non valesse la pena fare un’intera pillola… infondo si trattava solo di leggere il manuale on line… tuttavia mi è venuta un’altra idea, oltre quello di spiegare chiaramente le [poche] funzioni utilizzate ho fatto una funzione che svolge nel modo migliore la lettura di una directory.
Let’s Start
opendir($directory):
è una funzione semplicissima, molto simile alle funzioni x aprire un database o un file, solo più semplice, prende un solo parametro e restituisce un identificativo (handle) relativo alla directory aperta. La directory viene specificata nell’unico parametro che questa funzione prende.
Codice PHP:
$handle = opendir(‘c:/html.it’);
closedir($handle):
questa funzione, altrettanto semplice, viene utilizzata per “chiudere” l’handle della directory. Viene usata quindi dopo una chiamata a opendir(). Non restituisce alcun risultato, quindi non è possibile verificare se fallisce (tralasciando i classici warning)
Codice PHP:
$handle = opendir(‘c:/html.it’);
<blocco istruzioni>
closedir($handle);
readdir($handle):
questa è la funzione che dovrebbe essere utilizzata da tutti coloro che hanno bisogno di leggere una directory. L’unico parametro che prende è l’handle della directory. Come negli array e nei file, esiste un puntatore che punta ad un elemento (negli array un elemento degli array, nei file il punto in cui scrivere), il puntatore inizialmente punterà sul primo elemento (nell’ordine in cui sono stati memorizzati) contenuto nella directory. A questo punto se esiste lo restituisce come stringa e sposta il puntatore all’elemento successivo. Da notare però che i primi due elementi di ogni directory sono “.” e “..”, non so’ a cosa servono, qualcuno me lo spieghi so’ solo che compaiono anche in dos quando eseguiamo il comando “dir”. Boh
Quindi:
Codice PHP:
$handle = opendir(‘c:/html.it’);
while($file = readdir($fd)){
$ris[count($ris)] = $file;
}
closedir($handle);
ci possono essere vari inconveniente esaminando l’array $ris, esso infatti contiene anche i nomi delle cartelle contenute in esso senza aprirle. Per leggere tutti i file contenuti anche nelle sotto cartelle utilizzare la mia funzione dichiarata più giù.
is_dir():
verifica semplicemente se la stringa passata come parametro è una directory, restituisce un valore booleano, true se lo è, false se non lo è.
A questo punto con queste semplici funzioni si può costruire una funzione che legge tutti i file contenuti anche nelle subdirectory. Procedo con la dichiarazione:
Codice PHP:
function dirtree($path){
/**
* author: kuarl<grivier@animeterminal.it>
* date: 26-08-2002
*/
$fd = opendir($path);
while($file = readdir($fd)){
if($file != '.' && $file != '..'){
$ris[count($ris)] = $path."/".$file;
if(is_dir($ris[count($ris)-1])){
unset($ris[count($ris)-1]);
$ris = array_merge($ris, dirtree($path."/".$file));
}
}
}
// questo pezzo serve x le directory vuote
if(!@sort($ris)){
$ris[0] = $path;
}
//------------------------------------------------
closedir($fd);
return $ris;
}
questa funzione prende come parametro una directory e ne restituisce tutti i file in un array, se una directory e vuota ne restituisce solo il nome, se questo comportamento secondario è scomodo basta commentare o eliminare la relativa parte di codice.
Ogni elemento dell’array restituito può essere usato in altre funzioni che richiedono l’accesso a dei file come fileopen() o essere inserito come indirizzo in un link:
Codice PHP:
print ‘[url="”’.$ris[4].”"]’.$ris [4].’[/url]’;
gli impieghi sono limitati unicamente dalle vostre capacità
Alla prossima!
Kuarl