Come configurare smartphone e PC. Portale informativo
  • casa
  • Interessante
  • Ottenere un elenco di file e directory utilizzando PHP. Scandir - Ottiene un elenco di file e directory situati in un percorso specificato Elenco Php dei file in una directory

Ottenere un elenco di file e directory utilizzando PHP. Scandir - Ottiene un elenco di file e directory situati in un percorso specificato Elenco Php dei file in una directory

In questa lezione affronteremo un compito tipico che si presenta lavorando su un progetto PHP: ottenere un elenco di file e directory. Discuteremo diversi approcci di base e più sofisticati, elencando i pro e i contro di ciascuno. Le prime tre soluzioni utilizzeranno le funzioni PHP standard, quindi ne introdurremo una più robusta utilizzando gli iteratori SPL.

Ai fini di una discussione sostanziale della soluzione e delle dimostrazioni, assumeremo che la struttura della directory sia la seguente:

\---direttore | \---utente | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Soluzioni di base

Il primo insieme di soluzioni si basa sull'utilizzo della funzione glob(), una combinazione delle funzioni opendir() , readdir() e closedir() e anche della funzione scandir().

Usando glob()

La prima soluzione si basa sull'utilizzo della funzione glob(), che permette di cercare percorsi utilizzando pattern. La funzione ha due parametri:

  • $pattern (richiesto): modello di ricerca
  • $flags (opzionale): uno o più flag, la cui descrizione è reperibile nella documentazione

Diamo un'occhiata agli esempi. Per cercare in una directory tutti i file e le directory i cui nomi terminano con .TXT, dovresti usare il codice:

Se visualizziamo la variabile $filelist, otteniamo:

Array (0 => "articolo.txt", 1 => "testo.txt")

Se hai bisogno di un elenco di file e directory i cui nomi iniziano con "te", il codice sarà simile a questo:

E l'output è simile a:

Array (0 => "test.dat", 1 => "text.txt")

E per ottenere un elenco di sole directory con nomi contenenti "ma", usa il codice:

L'ultimo esempio restituirà:

Array (0 => "gestore")

Si noti che l'ultimo esempio utilizza il flag GLOB_ONLYDIR come secondo parametro della funzione. Pertanto il file master.dat viene escluso dall'elenco. Sebbene la funzione glob() sia molto semplice da usare, a volte non è abbastanza flessibile. Ad esempio, non esiste alcun flag per ottenere solo i file (nessuna directory) che corrispondono al modello.

Usiamo opendir() , readdir() e closedir() .

Il secondo approccio per ottenere un elenco di file e directory di cui parleremo è utilizzare le funzioni opendir() , readdir() e closedir() .

La funzione opendir() apre una directory e restituisce un handle di connessione. Una volta ottenuto l'handle, è possibile utilizzare la funzione readdir(). Ad ogni chiamata, questa funzione restituisce il nome del file o della directory successiva all'interno della directory aperta. Se tutti i nomi sono già stati elencati, la funzione restituisce falso. La funzione closedir() viene utilizzata per chiudere l'handle.

A differenza dell'utilizzo della funzione glob(), questo approccio è più complesso perché non sono disponibili parametri per filtrare l'elenco dei nomi di file e directory restituiti. Devi eseguire tu stesso il filtraggio per ottenere i risultati desiderati.

L'esempio seguente restituisce un elenco di nomi di file e directory che iniziano con "te":

Quando si esegue il codice precedente, la variabile $entry conterrà inclusioni come "." E "..". Queste sono due directory virtuali che esistono in ogni directory del file system. Rappresentano rispettivamente la directory corrente e la directory principale.

Il secondo esempio mostra solo i file contenuti nella directory specificata.

L'esempio produrrà quanto segue:

Array (0 => "articolo.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

Utilizzando scandir()

Infine, introduciamo la funzione scandir(). Ha un solo parametro obbligatorio: il percorso di lettura. La funzione restituisce un array di file e directory situati nel percorso specificato. Per ottenere un elenco di file e directory in base a un criterio specifico, è necessario eseguire ulteriori filtri. La soluzione invece è più concisa e non richiede la gestione degli handle.

Questo esempio mostra come ottenere un elenco di file e directory i cui nomi iniziano con "te":

Usiamo gli iteratori SPL

Ora diamo un'occhiata all'utilizzo degli iteratori SPL. Ma prima di iniziare a risolvere il nostro problema, diamo un'introduzione alla libreria SPL e agli iteratori. La libreria SPL fornisce una serie di classi per strutture dati orientate agli oggetti, iteratori, descrittori di file e altro.

Uno dei vantaggi degli iteratori è che sono classi e possono essere estesi per soddisfare le proprie esigenze. Un altro vantaggio è che gli iteratori hanno i propri metodi, utili per risolvere molti problemi comuni e si trovano in un unico posto. Guarda un esempio di utilizzo di FilesystemIterator rispetto a readdir() . Entrambi i metodi utilizzano un ciclo, ma con readdir() si elabora solo una stringa, mentre FilesystemIterator funziona con un oggetto che può contenere informazioni aggiuntive sul file o sulla directory (dimensione, proprietario, autorizzazioni e così via).

Naturalmente PHP offre la possibilità di ottenere tali informazioni utilizzando funzioni come filesize() e fileowner(). Ma PHP5 si basa sull'utilizzo del concetto OOP. Pertanto, è meglio utilizzare metodi moderni per lavorare con un linguaggio di programmazione. Sul nostro sito Web sono disponibili lezioni su come lavorare con gli iteratori.

Come già affermato nella parte acquatica del tutorial, tratteremo l'uso di FilesystemIterator, RecursiveDirectoryIterator e GlobIterator. Il primo eredita da DirectoryIterator e il resto da FilesystemIterator . Hanno tutti lo stesso costruttore, che accetta due parametri:

  • $percorso (obbligatorio): percorso della voce del file system su cui vengono eseguite le operazioni
  • $flags (opzionale): uno o più flag elencati nella documentazione

La vera differenza tra questi iteratori è il modo in cui vengono utilizzati per navigare in un determinato percorso.

FilesystemIterator

Usare FilesystemIterator è molto semplice. Vediamolo in azione. Presentiamo due esempi. Il primo mostra la ricerca di tutti i file e le directory i cui nomi iniziano con “te”. Il secondo esempio utilizza un altro RegexIterator per trovare tutti i file e le directory i cui nomi terminano con "t.dat" o "t.php". RegexIterator viene utilizzato per filtrare il risultato in base alle espressioni regolari.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Il codice precedente produrrà un risultato simile agli esempi precedenti.

Secondo esempio utilizzando RegexIterator:

getNomeFile(); )

Verrà prodotto:

Array (0 => "script.php", 1 => "test.dat")

RecursiveDirectoryIterator

RecursiveDirectoryIterator fornisce un'interfaccia per attraversare ricorsivamente le directory del file system. Ha diversi metodi utili, come getChildren() e hasChildren(), che restituiscono un iteratore per la posizione corrente se è una directory e controllano se il punto di ingresso corrente è una directory. L'esempio seguente dimostra l'uso di RecursiveDirectoryIterator e getChildren() . Il risultato sarà lo stesso degli esempi precedenti.

getChildren(), "/t\.(php|dat)$/"); $elencofile = array(); foreach($filtro come $voce) ( $filelist = $voce->getFilename(); )

GlobIterator

GlobIterator scorre il file system allo stesso modo della funzione glob(). Il primo parametro può includere un modello per il nome. L'esempio dimostra l'uso di GlobIterator con lo stesso risultato di prima.

getNomeFile(); )

Conclusione

Questa lezione dimostra l'uso di approcci diversi per raggiungere lo stesso obiettivo: ottenere un elenco di file e directory. È opportuno ricordare i seguenti punti chiave:

  • La funzione glob() è una soluzione integrata, ma non è sufficientemente flessibile.
  • Una soluzione basata su opendir() , readdir() e closedir() è più complessa e richiede filtri aggiuntivi, ma è più flessibile.
  • La funzione scandir() richiede un filtraggio aggiuntivo, ma funziona senza elaborare l'handle.
  • Se stai utilizzando un approccio OOP, dovresti utilizzare la libreria SPL. Inoltre, puoi estendere le lezioni con le tue funzionalità.
  • GlobIterator ha una funzionalità di prefiltro, mentre altri utilizzano RegexIterator.

In questa lezione affronteremo un compito tipico che si presenta lavorando su un progetto PHP: ottenere un elenco di file e directory. Discuteremo diversi approcci di base e più sofisticati, elencando i pro e i contro di ciascuno. Le prime tre soluzioni utilizzeranno le funzioni PHP standard, quindi ne introdurremo una più robusta utilizzando gli iteratori SPL.

Ai fini di una discussione sostanziale della soluzione e delle dimostrazioni, assumeremo che la struttura della directory sia la seguente:

\---direttore | \---utente | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Soluzioni di base

Il primo insieme di soluzioni si basa sull'utilizzo della funzione glob(), una combinazione delle funzioni opendir() , readdir() e closedir() e anche della funzione scandir().

Usando glob()

La prima soluzione si basa sull'utilizzo della funzione glob(), che permette di cercare percorsi utilizzando pattern. La funzione ha due parametri:

  • $pattern (richiesto): modello di ricerca
  • $flags (opzionale): uno o più flag, la cui descrizione è reperibile nella documentazione

Diamo un'occhiata agli esempi. Per cercare in una directory tutti i file e le directory i cui nomi terminano con .TXT, dovresti usare il codice:

Se visualizziamo la variabile $filelist, otteniamo:

Array (0 => "articolo.txt", 1 => "testo.txt")

Se hai bisogno di un elenco di file e directory i cui nomi iniziano con "te", il codice sarà simile a questo:

E l'output è simile a:

Array (0 => "test.dat", 1 => "text.txt")

E per ottenere un elenco di sole directory con nomi contenenti "ma", usa il codice:

L'ultimo esempio restituirà:

Array (0 => "gestore")

Si noti che l'ultimo esempio utilizza il flag GLOB_ONLYDIR come secondo parametro della funzione. Pertanto il file master.dat viene escluso dall'elenco. Sebbene la funzione glob() sia molto semplice da usare, a volte non è abbastanza flessibile. Ad esempio, non esiste alcun flag per ottenere solo i file (nessuna directory) che corrispondono al modello.

Usiamo opendir() , readdir() e closedir() .

Il secondo approccio per ottenere un elenco di file e directory di cui parleremo è utilizzare le funzioni opendir() , readdir() e closedir() .

La funzione opendir() apre una directory e restituisce un handle di connessione. Una volta ottenuto l'handle, è possibile utilizzare la funzione readdir(). Ad ogni chiamata, questa funzione restituisce il nome del file o della directory successiva all'interno della directory aperta. Se tutti i nomi sono già stati elencati, la funzione restituisce falso. La funzione closedir() viene utilizzata per chiudere l'handle.

A differenza dell'utilizzo della funzione glob(), questo approccio è più complesso perché non sono disponibili parametri per filtrare l'elenco dei nomi di file e directory restituiti. Devi eseguire tu stesso il filtraggio per ottenere i risultati desiderati.

L'esempio seguente restituisce un elenco di nomi di file e directory che iniziano con "te":

Quando si esegue il codice precedente, la variabile $entry conterrà inclusioni come "." E "..". Queste sono due directory virtuali che esistono in ogni directory del file system. Rappresentano rispettivamente la directory corrente e la directory principale.

Il secondo esempio mostra solo i file contenuti nella directory specificata.

L'esempio produrrà quanto segue:

Array (0 => "articolo.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

Utilizzando scandir()

Infine, introduciamo la funzione scandir(). Ha un solo parametro obbligatorio: il percorso di lettura. La funzione restituisce un array di file e directory situati nel percorso specificato. Per ottenere un elenco di file e directory in base a un criterio specifico, è necessario eseguire ulteriori filtri. La soluzione invece è più concisa e non richiede la gestione degli handle.

Questo esempio mostra come ottenere un elenco di file e directory i cui nomi iniziano con "te":

Usiamo gli iteratori SPL

Ora diamo un'occhiata all'utilizzo degli iteratori SPL. Ma prima di iniziare a risolvere il nostro problema, diamo un'introduzione alla libreria SPL e agli iteratori. La libreria SPL fornisce una serie di classi per strutture dati orientate agli oggetti, iteratori, descrittori di file e altro.

Uno dei vantaggi degli iteratori è che sono classi e possono essere estesi per soddisfare le proprie esigenze. Un altro vantaggio è che gli iteratori hanno i propri metodi, utili per risolvere molti problemi comuni e si trovano in un unico posto. Guarda un esempio di utilizzo di FilesystemIterator rispetto a readdir() . Entrambi i metodi utilizzano un ciclo, ma con readdir() si elabora solo una stringa, mentre FilesystemIterator funziona con un oggetto che può contenere informazioni aggiuntive sul file o sulla directory (dimensione, proprietario, autorizzazioni e così via).

Naturalmente PHP offre la possibilità di ottenere tali informazioni utilizzando funzioni come filesize() e fileowner(). Ma PHP5 si basa sull'utilizzo del concetto OOP. Pertanto, è meglio utilizzare metodi moderni per lavorare con un linguaggio di programmazione. Sul nostro sito Web sono disponibili lezioni su come lavorare con gli iteratori.

Come già affermato nella parte acquatica del tutorial, tratteremo l'uso di FilesystemIterator, RecursiveDirectoryIterator e GlobIterator. Il primo eredita da DirectoryIterator e il resto da FilesystemIterator . Hanno tutti lo stesso costruttore, che accetta due parametri:

  • $percorso (obbligatorio): percorso della voce del file system su cui vengono eseguite le operazioni
  • $flags (opzionale): uno o più flag elencati nella documentazione

La vera differenza tra questi iteratori è il modo in cui vengono utilizzati per navigare in un determinato percorso.

FilesystemIterator

Usare FilesystemIterator è molto semplice. Vediamolo in azione. Presentiamo due esempi. Il primo mostra la ricerca di tutti i file e le directory i cui nomi iniziano con “te”. Il secondo esempio utilizza un altro RegexIterator per trovare tutti i file e le directory i cui nomi terminano con "t.dat" o "t.php". RegexIterator viene utilizzato per filtrare il risultato in base alle espressioni regolari.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Il codice precedente produrrà un risultato simile agli esempi precedenti.

Secondo esempio utilizzando RegexIterator:

getNomeFile(); )

Verrà prodotto:

Array (0 => "script.php", 1 => "test.dat")

RecursiveDirectoryIterator

RecursiveDirectoryIterator fornisce un'interfaccia per attraversare ricorsivamente le directory del file system. Ha diversi metodi utili, come getChildren() e hasChildren(), che restituiscono un iteratore per la posizione corrente se è una directory e controllano se il punto di ingresso corrente è una directory. L'esempio seguente dimostra l'uso di RecursiveDirectoryIterator e getChildren() . Il risultato sarà lo stesso degli esempi precedenti.

getChildren(), "/t\.(php|dat)$/"); $elencofile = array(); foreach($filtro come $voce) ( $filelist = $voce->getFilename(); )

GlobIterator

GlobIterator scorre il file system allo stesso modo della funzione glob(). Il primo parametro può includere un modello per il nome. L'esempio dimostra l'uso di GlobIterator con lo stesso risultato di prima.

getNomeFile(); )

Conclusione

Questa lezione dimostra l'uso di approcci diversi per raggiungere lo stesso obiettivo: ottenere un elenco di file e directory. È opportuno ricordare i seguenti punti chiave:

  • La funzione glob() è una soluzione integrata, ma non è sufficientemente flessibile.
  • Una soluzione basata su opendir() , readdir() e closedir() è più complessa e richiede filtri aggiuntivi, ma è più flessibile.
  • La funzione scandir() richiede un filtraggio aggiuntivo, ma funziona senza elaborare l'handle.
  • Se stai utilizzando un approccio OOP, dovresti utilizzare la libreria SPL. Inoltre, puoi estendere le lezioni con le tue funzionalità.
  • GlobIterator ha una funzionalità di prefiltro, mentre altri utilizzano RegexIterator.

Lavorare con i file

La necessità di operazioni con file si confronta molto spesso con il programmatore. Se i tuoi script non utilizzano database, i file sono gli unici dispositivi di archiviazione accettabili per lo script. L'uso dei file come archivi di informazioni sull'esecuzione degli script ne consente l'utilizzo in un'ampia varietà di situazioni. Quasi tutti i controscript per qualcosa sono scritti basandosi sul lavoro con i file. È anche possibile fornire molti altri esempi, ma è ora di passare direttamente dalle parole ai fatti.

Voglio dire subito che lavorare con il file deve essere autorizzato. Per impostazione predefinita, PHP non consente la manipolazione dei file per motivi di sicurezza. Per rimuovere questo divieto nel gestore FTP CuteFTP, seleziona tutte le caselle nelle proprietà del file; altri gestori dovrebbero avere qualcosa di simile.

il file esiste

Prima di eseguire operazioni su un file, spesso è necessario assicurarsi che il file specificato esista. Questo è ciò che fa la funzione file_exists. Questa funzione può restituire solo due valori, come puoi immaginare VERO(se il file specificato esiste) e FALSO. In genere, l'utilizzo di questa funzione è simile al seguente:

Tieni presente che la funzione funziona solo su file locali, ovvero se desideri verificare se Yandex ha acquisito un file robot.txt, i tuoi sforzi saranno vani. Ma è possibile controllare qualsiasi file situato sul server locale, indipendentemente dalla directory in cui si trova.

Ecco alcune regole per descrivere il percorso di un file.

dimensione del file

Come suggerisce il nome, la funzione determina la dimensione del file e la restituisce in byte. Utile se vuoi controllare un file per vedere se contiene informazioni (come puoi immaginare, un file vuoto contiene 0 byte), ed è anche possibile controllare la dimensione del file per vedere se supera un certo limite.

file

Questa funzione funziona già direttamente con il file. Restituisce il contenuto del file specificato e lo fa sotto forma di un array, dove ogni elemento è una riga del file. La funzione è utile quando è necessario memorizzare diversi valori diversi in un unico file che non devono intersecarsi. Quindi ogni valore viene memorizzato su una riga separata e letto dalla funzione file, che restituisce un array, in modo che si possa accedere alla variabile data leggendo il valore dell'elemento dell'array con l'indice corrispondente alla riga nel file.

È anche possibile riunire tutti gli elementi dell'array restituito in un'unica variabile. Questo viene fatto utilizzando la funzione implode array.

fopen

Se la funzione precedente è autonoma e generalmente non correlata ad altre funzioni, le funzioni successive per lavorare con i file funzionano insieme a fopen . Questa funzione apre il file specificato e restituisce l'identificatore di connessione del file, che viene utilizzato per scopi di servizio. Questa funzione non è in alcun modo associata al contenuto del file.

La funzione fopen dispone di diverse modalità per lavorare con un file. Sono indicati dopo il nome del file e sono i seguenti:

    "R"
    Il file viene aperto solo per leggerne il contenuto.

    "r+"
    Apertura di un file sia in lettura che in scrittura.

    "w"
    Il file viene aperto per scopi di scrittura.

    "w+"
    Aprire il file per leggere e scrivere.

    "UN"
    Il file viene aperto per la scrittura alla fine del file (aggiunta).

    "a+"
    Si apre per ulteriori scritture e letture.

fget

Funzione per leggere un file aperto dalla funzione fopen. Ma a differenza di file, questa funzione restituisce solo una riga del file ogni volta che viene eseguita e sposta il puntatore del file interno alla riga successiva, che leggerà la prossima volta che verrà chiamata la funzione. Pertanto, se è necessario leggere l'intero file, è necessario utilizzare questa funzione in un ciclo.

Tieni presente che la funzione fgets utilizza un parametro di lunghezza aggiuntivo, che specifica la lunghezza massima di una riga di file da leggere. Se la dimensione della stringa supera questo numero, la funzione la restituirà in forma “troncata” di lunghezza byte. Per impostazione predefinita, questo parametro è impostato su 1024 byte o un kilobyte. Prestare particolare attenzione a questo parametro se si utilizzano file di grandi dimensioni, poiché durante la lettura di tali file, il buffer di esecuzione PHP potrebbe traboccare (la sua dimensione è indicata nel file di configurazione), causando un blocco.

Si noti che il file da leggere non è il nome del file, ma l'identificatore di connessione del file restituito dalla funzione fopen (nel nostro esempio, il valore della variabile $file).

fputs

La funzione di scrivere informazioni su un file, e lo fa secondo il principio di funzionamento della funzione fgets, ovvero inizia a scrivere dalla posizione del puntatore del file interno. In generale, questa funzione è per molti aspetti simile alla precedente: utilizza anche il parametro della lunghezza dei dati di scrittura, anch'esso opzionale.

fclose

Come avrai intuito, questa funzione chiude il file specificato. In realtà, al termine dello script, PHP stesso chiude tutti i file aperti, ma è comunque meglio farlo manualmente. Come parametro della funzione, è necessario specificare l'identificatore della connessione file.

Per illustrare la combinazione delle funzioni di cui sopra, forniremo un esempio di creazione di un semplice contatore visite.

$file = fopen("contatore.txt", "r");
$c = fgets($file, 150);
fclose($file);
$c++;
$file = fopen("contatore.txt", "w");
fputs($file, $c);
fclose($file);
eco $c;
?>

Lavorare con le directory

Strettamente correlate alle azioni sui file sono le operazioni sulle directory. L'algoritmo per lavorare con loro è simile alle operazioni sui file: prima devi aprire la directory, eseguire alcune azioni e, infine, chiuderla.

opendir

Questa funzione apre la directory specificata e restituisce l'identificatore del servizio per la connessione alla directory. I percorsi delle directory devono essere specificati come segue:

Il punto indica l'apertura della directory corrente

. /File/

Apertura di una cartella File situato nella directory corrente

Apertura di una cartella di un livello superiore a quella corrente

readdir

La funzione legge la directory aperta da opendir . Per ogni passaggio restituisce il nome del file o della cartella situato nella directory specificata e sposta il puntatore interno all'oggetto directory successivo. Quindi per leggere l'intera directory deve essere utilizzata in un ciclo.

Va inoltre notato che questa funzione restituisce oggetti di servizio cartella . E .. , che può essere tagliato quando viene restituito dall'istruzione IF.

closedir

Chiudiamo la directory, specificando l'identificatore di connessione della cartella come argomento.

A volte l'uso delle funzioni di directory rende la vita molto più semplice. Ad esempio, nella sezione Funzionalità è possibile visualizzare un elenco di funzionalità in ordine alfabetico. Riesci a immaginare quanto tempo ci vorrebbe per scrivere manualmente l'intero elenco con collegamenti e persino in ordine alfabetico. Ed è qui che mi hanno aiutato le funzioni per lavorare con le directory. Ogni funzione è stata inserita in un file separato con un nome corrispondente al nome della funzione, senza alcuna estensione.

Pertanto, ogni volta che visiti la pagina, ottieni un elenco di funzioni appena generato.

È tutto. Ci vediamo alla prossima lezione.

L'elenco delle directory è il processo per ottenere informazioni su directory e file per una determinata directory principale, nonché la possibilità di applicare vari filtri a questi dati per correggere l'output.

In questo esempio, proveremo ad affrontare un'attività tipica che appare in quasi tutti PHP progetto - ottenere un elenco di directory e/o file. L'esempio utilizza diversi approcci di base e più complessi, delineando i pro e i contro di ciascuna tecnica. Le prime tre soluzioni utilizzano funzioni PHP standard. L'ultima soluzione più affidabile che utilizza gli iteratori PHP SPL.


Per una rappresentazione più visiva, utilizziamo una struttura di directory simile a questa:


\-Applicazione | \-Utente | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Soluzioni di base
La prima serie di esempi utilizza le funzioni globo() e combinazioni di funzioni opendir(), leggidir(), chiuso(), così come la funzione scandir().

Usando glob()

Esempio di utilizzo di una funzione php globo(), che ti consente di cercare un percorso utilizzando uno schema.
Funzione globo( $modello,$bandiere) opera con due argomenti:
  • $modello(obbligatorio): stringa del modello di ricerca
  • $bandiere
    • GLOB_MARK- Aggiunge una barra a ciascuna directory restituita.
    • GLOB_NOSORT- Restituisce i file nella forma in cui sono contenuti nella directory (senza ordinamento). Se questo flag non è specificato, i nomi vengono ordinati in ordine alfabetico.
    • GLOB_NOCHECK- Restituisce un modello di ricerca se non è stato trovato alcun file utilizzandolo.
    • GLOB_NOESCAPE- Le barre rovesciate non sfuggono ai metacaratteri.
    • GLOB_BRACE- Espande (a,b,c) per corrispondere a "a", "b" o "c".
    • GLOB_ONLYDIR- Restituisce solo le directory che corrispondono al modello.
    • GLOB_ERR- Si interrompe in caso di errori di lettura (ad esempio, directory senza autorizzazione di lettura), per impostazione predefinita gli errori vengono ignorati.
Per cercare in una directory tutti i file e le directory i cui nomi terminano con .txt, utilizzare il seguente codice:Nell'output otteniamo il seguente risultato: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Se è necessario ottenere un elenco di file e directory i cui nomi iniziare con "te":Nell'output otteniamo il seguente risultato: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Ottiene solo le directory con nomi contenenti "er" nell'elenco:Nell'output otteniamo il seguente risultato: array(1) ( => string(4) "Utente" )

L'ultimo esempio utilizza il flag GLOB_ONLYDIR come secondo argomento della funzione. Pertanto, nell'elenco è stata inclusa solo la directory "Utente" nel nome, che contiene "er". La funzione glob() è molto semplice da usare, ma a volte non è abbastanza flessibile. Non esiste alcun flag per ottenere solo i file (nessuna directory) che corrispondono al modello.

Utilizzando opendir(), readdir() e closedir().

Il metodo successivo per ottenere un elenco di file e directory è utilizzare le funzioni PHP opendir(), leggidir() E chiuso().

Funzione opendir() restituisce un handle alla directory aperta. Una volta ricevuto l'handle, è possibile utilizzare la funzione leggidir(). Quando si accede a un handle, la funzione leggidir() visualizza il nome del file o della directory successiva. Se tutti gli elementi contenuti nel descrittore sono già stati enumerati, la funzione leggidir() sarà di ritorno falso. Per chiudere il descrittore utilizziamo la funzione chiuso().


A differenza dell'utilizzo della funzione php , questo approccio è un po' più complicato. Non è possibile impostare parametri di filtro che aiutino a generare in anticipo un elenco di nomi di file e directory restituiti. Per ottenere l'elenco richiesto di file e directory, il filtraggio deve essere eseguito in modo indipendente.


L'esempio seguente restituisce un elenco di nomi di file e directory che iniziano con "Us":L'output sarà il seguente: array(1) ( => string(4) "Utente" ) L'esempio seguente restituirà solo i file contenuti nella directory specificata.Nell'output otteniamo il seguente risultato: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => stringa(10) "readme.txt" )

Utilizzando scandir().

Per finire, diamo un'occhiata a un esempio di utilizzo di una funzione php scandir(). Ha un solo attributo obbligatorio: il percorso della directory di lettura. Il risultato della funzione è un array di file e directory situati lungo il percorso specificato nell'argomento. Come nell'esempio precedente, per ottenere un elenco filtrato di file e directory, è necessario eseguirlo manualmente. Visivamente, la soluzione è più breve e non è richiesta la gestione dei descrittori.


L'esempio mostra come ottenere un elenco di file e directory i cui nomi iniziano con "te":Nell'output otteniamo il seguente risultato: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Soluzione avanzata che utilizza PHP SPL
Soluzione più affidabile utilizzando gli iteratori SPL FilesystemIterator, RecursiveDirectoryIterator E GlobIterator.

Utilizzo degli iteratori SPL.

Diamo un'occhiata all'utilizzo degli iteratori SPL. Prima di iniziare a risolvere il problema, familiarizziamo un po' con la libreria PHP SPL e gli iteratori. La libreria SPL fornisce set specializzati di classi per strutture dati orientate agli oggetti, iteratori, descrittori di file e altro ancora.


Il vantaggio principale degli iteratori è che sono classi e possono essere estesi utilizzando il meccanismo standard di ereditarietà delle classi PHP. Un altro vantaggio è che gli iteratori hanno i propri metodi che possono essere utili per risolvere problemi comuni e si trovano tutti nello stesso posto. Vediamo un esempio di utilizzo FilesystemIterator e confrontare con leggidir(). Entrambi i metodi utilizzano un ciclo, ma nel caso leggidir() sarà possibile elaborare solo la stringa, ma FilesystemIterator può funzionare con un oggetto. Che può contenere informazioni aggiuntive sul file o sulla directory come proprietario, dimensione, diritti di accesso e così via.


Naturalmente, PHP ha la capacità di ottenere queste informazioni utilizzando funzioni, dimensione del file(), proprietario del file() e altri. Ma PHP, come ogni linguaggio di programmazione, ha la capacità di cambiare. In PHP5 c'è un crescente desiderio di utilizzare i concetti di OOP. Pertanto, è meglio utilizzare metodi moderni per lavorare con un linguaggio di programmazione.


Considera l'utilizzo FilesystemIterator, RecursiveDirectoryIterator E GlobIterator. Il primo iteratore viene ereditato da DirectoryIterator e il resto da FilesystemIterator. Hanno tutti lo stesso costruttore, che accetta due argomenti:

  • $percorso(obbligatorio): percorso dell'elemento del file system su cui vengono eseguite le operazioni
  • $bandiere(facoltativo): uno o più flag
    • FilesystemIterator::CURRENT_AS_PATHNAME Fa sì che il metodo FilesystemIterator::current() restituisca un percorso.
    • FilesystemIterator::CURRENT_AS_FILEINFO Fa sì che il metodo FilesystemIterator::current() restituisca un'istanza di SplFileInfo.
    • FilesystemIterator::CURRENT_AS_SELF Fa sì che il metodo FilesystemIterator::current() restituisca $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Maschere FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Fa sì che il metodo FilesystemIterator::key() restituisca un percorso.
    • FilesystemIterator::KEY_AS_FILENAME Fa sì che il metodo FilesystemIterator::key() restituisca il nome del file.
    • FilesystemIterator::FOLLOW_SYMLINKS Forza il metodo RecursiveDirectoryIterator::hasChildren() a seguire i collegamenti simbolici.
    • FilesystemIterator::KEY_MODE_MASK Maschera FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Uguale a FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Salta i file punto (. e ..).
    • FilesystemIterator::UNIX_PATHS Forza tutti i percorsi a utilizzare barre rovesciate in stile Unix, indipendentemente dalle impostazioni predefinite del sistema.

La differenza tra questi iteratori è il modo in cui vengono utilizzati per navigare lungo un determinato percorso.

FilesystemIterator

Utilizzo FilesystemIterator molto semplice.
L'esempio mostra una ricerca per tutti i file e le directory i cui nomi iniziano con "te".

getFilename(),"te")===0): $arFileList = $obFile->getFilename(); finisci se; fine per ciascuno; //Visualizza il risultato var_dump($arFileList); ?> Nell'output otteniamo il seguente risultato: array(2) ( => string(7) "test.js" => string(9) "test.html" )

Esempio di utilizzo di un altro iteratore RegexIterator per cercare tutti i file e le directory i cui nomi terminano con "t.js" o "t.php". Iteratore RegexIterator viene utilizzato per filtrare il risultato e utilizza un motore di espressioni regolari.

getNomeFile(); fine per ciascuno; //Visualizza il risultato var_dump($arFileList); ?> Nell'output otteniamo il seguente risultato: array(2) ( => string(10) "script.php" => string(7) "test.js" )

RecursiveDirectoryIterator

Iteratore RecursiveDirectoryIterator fornisce un'interfaccia per attraversare ricorsivamente le directory del file system. Ha diversi metodi utili come getChildren() E haFigli(), che restituisce un iteratore per la posizione corrente se è una directory e controlla se il punto di ingresso corrente è una directory.


RecursiveDirectoryIterator E getChildren(). getChildren(), "/t\.(txt|css)$/"); $arFileList = array(); foreach($rxIterator as $obFile): $arFileList = $obFile->getFilename(); fine per ciascuno; //Visualizza il risultato var_dump($arFileList); ?> Nell'output otteniamo il seguente risultato in questo caso: questo è un file dalla directory "Utente": array(1) ( => string(8) "test.txt" )

GlobIterator

Iteratore GlobIterator esegue un attraversamento di file simile a . Il primo attributo può includere un modello di nome.


L'esempio ne dimostra l'uso GlobIterator con lo stesso risultato di prima.getNomeFile(); fine per ciascuno; //Visualizza il risultato var_dump($arFileList); ?> Nell'output otteniamo il seguente risultato: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Conclusione

Gli esempi precedenti esaminavano diversi metodi PHP per raggiungere lo stesso obiettivo: ottenere un elenco di file e directory.

Dagli esempi si possono evidenziare i seguenti punti principali:

I migliori articoli sull'argomento