2013-03-18 19 views
7

Muszę wyświetlić listę wszystkich plików (które mają określone rozszerzenia) w folderze i jego podfolderach. Użyłem RecursiveIteratorIterator, jak opisano w Wielkiej odpowiedzi @Matthew w PHP list all files in directory.Używanie programu RecursiveIteratorIterator do wyświetlania plików w folderze jest świetne. Czy mogę uzyskać ścieżkę nadrzędną i pełną ścieżkę?

  • Ustawiam katalog główny wyszukiwania na "..", a wszystkie nazwy plików otrzymują przedrostek "../". Jak mogę uzyskać tylko nazwę pliku?
  • W jaki sposób oprócz nazwy pliku mogę uzyskać nazwę folderu nadrzędnego?
  • ... i jak mogę uzyskać pełną ścieżkę do nazwy pliku?

I ostatnia rzecz: wyświetlanie drzewa plików, a może wszystkich katalogów, które nie mają podkatalogów, są przykładami rzeczy, które można chcieć zrobić, gdy mamy do czynienia z plikami. Jak poleciłbyś przekazać te dane po stronie klienta i jak by wyglądała struktura danych?

Odpowiedz

8

$filename w tej odpowiedzi w rzeczywistości nie jest ciągiem. Jest to obiekt typu SplFileInfo które mogą być używane jak struna, ale oferuje również znacznie bardziej szczegółowe informacje:

+1

Dzięki, działa świetnie. Ale co z katalogiem nadrzędnym? @sectus – user1639431

+1

@ user1639431, $ file_info-> getPathInfo() powinien zwrócić obiekt SplFileInfo katalogu nadrzędnego. – sectus

3

pomocą tego jako baza:

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

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

Każdy $fileInfo zwróci SplFileInfo obiektu. Ścieżka i nazwa pliku są łatwo dostępne oprócz wielu innych metod.

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

może się mylę, ale aby uzyskać dostęp do nazwy folderu nadrzędnego chyba nagrać go przez drzewo najprostsze byłoby wykorzystaniem dirname../ i dołączając do ścieżki.

+0

Martin, jakiego rodzaju wyjątku starasz się złapać? Dokumentacja nie mówi nic o wyjątkach w '__toString()'. – sectus

+0

Ups, wkleiłem go z otwartego pliku, który miałem, który wykorzystuje funkcje, które rzucają wyjątki, zapomniałem go usunąć. Naprawiono! – Martin

+0

@Martin: Przesyłaj na ciąg, zamiast używać '-> __ doString()'. Jest to zamierzone przez tę funkcję * i * nie powoduje żadnych wyjątków. (Możliwe, że zrobiłeś to dla celów debugowania, ale dla kodu tutaj, weź prosty wariant). – hakre

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