2013-03-18 8 views
7

Ho bisogno di elencare tutti i file (che hanno determinate estensioni) in una cartella e nelle sue sottocartelle. Ho usato RecursiveIteratorIterator come descritto nell'ottima risposta di @Matthew in PHP list all files in directory.L'utilizzo di RecursiveIteratorIterator per elencare i file nella cartella è ottimo. Posso ottenere anche il percorso genitore e il percorso completo?

  • Sto impostando la radice della ricerca su ".." e tutti i nomi di file hanno un prefisso "../". Come posso ottenere il nome file solo?
  • Come posso ottenere, oltre al nome file, il nome della cartella principale?
  • ... e come posso ottenere il percorso completo del nome file?

E un'ultima cosa: visualizzare un albero di file, o forse tutte le directory che non hanno sottodirectory, sono entrambi esempi di cose che si potrebbero voler fare quando si ha a che fare con i file. Come consiglieresti di passare questi dati al client e come sarebbe la struttura dei dati?

risposta

8

$filename in quella risposta non è in realtà una stringa. Si tratta di un oggetto di tipo SplFileInfo che può essere usato come un filo ma offre anche informazioni molto più dettagliate:

+1

Grazie, funziona alla grande. Ma che dire della directory principale? @sectus – user1639431

+1

@ user1639431, $ file_info-> getPathInfo() dovrebbe restituire l'oggetto SplFileInfo della directory padre. – sectus

3

Usando come base:

$iter = new RecursiveDirectoryIterator('../'); 

foreach (new RecursiveIteratorIterator($iter) as $fileName => $fileInfo) { 
    $fullPath = (string) $fileInfo; 
} 

Ogni $fileInfo restituirà un oggetto SplFileInfo. Il percorso e il nome del file sono facilmente accessibili in aggiunta a una serie di altri metodi.

phpSplFileInfo Object 
(
    [pathName:SplFileInfo:private] => ./t.php 
    [fileName:SplFileInfo:private] => t.php 
) 

posso sbagliarmi, ma per accedere al nome cartella principale a meno che non si registra l'immagine attraverso l'albero il più semplice sarebbe utilizzando dirname e aggiungendo ../ al percorso.

+0

Martin, che tipo di eccezione stai cercando di recuperare? La documentazione non diceva nulla sulle eccezioni in '__toString()'. – sectus

+0

Oops, l'ho incollato da un file aperto che utilizzava funzioni che generano eccezioni, ho dimenticato di rimuoverlo. Risolto! – Martin

+0

@Martin: Trasmetti su stringa invece di usare '-> __ toString()'. Questo è ciò che è inteso da quella funzione * e * non perde nessuna eccezione. (Puoi averlo fatto per ragioni di debug, ma per il codice qui, prendi la variante straight). – hakre

1
<?php 
    $iterator = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::CURRENT_AS_PATHNAME); 
    foreach ($iterator as $fileinfo) { 
     echo $iterator->current()->getPathname() . "\n"; 
    } 
?> 
Problemi correlati