PHP Pfad zu jeder Datei im Ordner / Unterordner in Array erhalten? [Duplikat]

7

Ich bin mir nicht sicher, wo ich anfangen soll. Aber ich muss die Pfade zu allen Dateien in einem Ordner und den gesamten Inhalt des Unterordners in Pfaden abrufen. Zum Beispiel, wenn ich einen Ordner mit fünf Ordnern hätte und jeder Ordner 10 MP3s usw., dann müsste mein Array 50 Pfade zu diesen Dateien finden.

Später sagen wir, dass ich einen weiteren Ordner hinzugefügt habe, der drei Ordner enthält und jeder Ordner zehn Bilder hat.

Mein Code müsste jetzt 80 Pfade finden und sie in einem Array speichern.

Macht meine Frage Sinn?

UPDATE:

Mein gewünschter Ausgang wäre, alle diese Pfade in einem Array zu speichern.

Aber ich würde den Code "LIEBEN", um dynamisch zu sein, was bedeutet, wenn ich später 10 weitere Ordner hinzufüge und jeder 17 Unterordner hat und jeder Ordner eine Vielzahl von verschiedenen Inhalten hat. Ich möchte, dass das Array die Dateipfade aller Dateien enthält. Das macht Sinn.

    
Papa De Beau 02.09.2012, 06:16
quelle

3 Antworten

23

Was Sie suchen, wird auch rekursives Verzeichnis genannt . Das bedeutet, dass Sie alle Verzeichnisse und Unterverzeichnisse und Dateien darin durchgehen. Wenn es ein Unterverzeichnis gibt, wird es ebenfalls durchlaufen und so weiter - so ist es rekursiv.

Wie Sie sich vorstellen können, ist das etwas, was Sie brauchen, wenn Sie eine Software schreiben und PHP unterstützt Sie dabei. Es bietet ein RecursiveDirectoryIterator , so dass Verzeichnisse rekursiv iteriert werden können und das Standard RecursiveIteratorIterator , um die Traversierung durchzuführen. Sie können dann mit einer einfachen Iteration auf alle Dateien und Verzeichnisse zugreifen, zum Beispiel über foreach :

%Vor%

In diesem Beispiel wird zunächst das Verzeichnis angegeben, das Sie durchlaufen möchten. Ich habe die aktuelle genommen:

%Vor%

Die nächste Codezeile ist ein wenig lang, es instantiiert den Verzeichnis-Iterator und dann der Iterator-Iterator , damit die baumähnliche Struktur in einer einzigen / flachen Schleife durchlaufen werden kann:

%Vor%

Diese $fileinfos werden dann mit einem einfachen foreach iteriert:

%Vor%

Darin gibt es einen Test, um zu vermeiden, dass alle Verzeichnisse ausgegeben werden. Dies geschieht mithilfe des SplFileInfo -Objekts, das iteriert wird. Es wird vom rekursiven Verzeichnis-Iterator bereitgestellt und enthält viele hilfreiche Eigenschaften und Methoden beim Arbeiten mit Dateien. Sie können zum Beispiel auch die Dateierweiterung, den Basisnamen Informationen über Größe und Zeit und so weiter zurückgeben.

%Vor%

Schließlich gebe ich nur den Pfadnamen aus, der der vollständige Pfad zur Datei ist:

%Vor%

Eine beispielhafte Ausgabe würde so aussehen (hier auf einem Windows-Betriebssystem):

%Vor%

Wenn ein Unterverzeichnis vorhanden ist, auf das nicht zugegriffen werden kann, würde Folgendes eine Ausnahme auslösen. Dieses Verhalten kann mit einigen Flags beim Instanziieren von RecursiveIteratorIterator :

gesteuert werden %Vor%

Ich hoffe, das war informativ. Sie können dies auch in eine eigene Klasse einbinden, und Sie können auch eine FilterIterator angeben, um die Entscheidung zu verschieben, ob eine Datei in der foreach -Schleife aufgelistet werden soll oder nicht.

Die Stärke der Kombination RecursiveDirectoryIterator und RecursiveIteratorIterator kommt aus ihrer Flexibilität. Was oben nicht behandelt wurde, sind sogenannte FilterIterator s. Ich dachte, ich füge ein weiteres Beispiel hinzu, das zwei selbstgeschriebene von ihnen verwendet, die ineinander gesteckt werden, um sie zu kombinieren.

  • Einer besteht darin, alle Dateien und Verzeichnisse herauszufiltern, die mit einem Punkt beginnen (das sind versteckte Dateien auf UNIX-Systemen, also sollten Sie diese Informationen nicht nach außen geben) und
  • Ein anderer, der die Liste nur nach Dateien filtert. Das ist die Überprüfung, die zuvor innerhalb der foreach war.

Eine weitere Änderung in diesem Anwendungsbeispiel besteht darin, die Funktion getSubPathname() zu verwenden, die den Start des Unterpfades zurückgibt aus dem Wurzelpfad der Iteration, also demjenigen, nach dem Sie suchen.

Außerdem füge ich explizit das SKIP_DOTS -Flag hinzu, das das Durchlaufen von . und% verhindert. co_de% (technisch nicht wirklich notwendig, weil die Filter diese ebenso wie Verzeichnisse filtern würden, aber ich denke, dass es korrekter ist) und als Pfade zurückgeben als .. also sind die Strings von Pfaden immer Unix-ähnliche Pfade, unabhängig vom zugrundeliegenden Betriebssystem. Das ist normalerweise eine gute Idee, wenn diese Werte sind über HTTP später wie in Ihrem Fall angefordert:

%Vor%

Dieses Beispiel ähnelt dem vorherigen, allerdings ist die UNIX_PATHS Build etwas anders konfiguriert. Besonders der Teil über die Filter ist neu:

%Vor%

So wird der Verzeichnis-Iterator in einen Filter eingefügt und der Filter selbst wird in einen anderen Filter eingefügt. Der Rest hat sich nicht geändert.

Der Code für diese Filter ist ziemlich einfach, sie arbeiten mit der Funktion $fileinfos , die entweder accept oder true ist, die zu übernehmen oder herauszufiltern ist:

%Vor%

Und das ist es schon wieder. Natürlich können Sie diese Filter auch für andere Fälle verwenden. Z.B. wenn Sie eine andere Art von Verzeichnisliste haben.

Und noch eine beispielhafte Ausgabe mit dem false weggeschnitten:

%Vor%

Nicht mehr $rootpath oder .git Verzeichnisdurchsuchung oder Auflistung von Dateien wie .svn oder .builtpath .

  

Hinweis für .project und FilesOnlyFilter :      Der Filter verweigert explizit die Verwendung von Verzeichnissen und , die auf dem LEAVES_ONLY -Objekt basieren ( nur reguläre Dateien, die existieren ). Es ist also eine echte Filterung basierend auf dem Dateisystem.
  Eine andere Methode, um nur Nicht-Verzeichniseinträge mit SplFileInfo zu versenden, ist der Standard RecursiveIteratorIterator flag (hier auch in den Beispielen). Dieses Flag funktioniert nicht als Filter und ist unabhängig vom zugrunde liegenden Iterator. Es gibt nur das an Die Iteration sollte keine Verzweigungen ( hier: Verzeichnisse im Falle des Verzeichnis-Iterators) zurückgeben.

    
hakre 02.09.2012, 06:50
quelle
4

Wenn Sie Linux verwenden und es Ihnen nichts ausmacht, einen Shell-Befehl auszuführen, können Sie dies alles in einer Zeile tun

%Vor%

Ausgabe:

%Vor%

Die nächste kürzeste Auswahl, die nur PHP verwendet, ist glob - aber es scannt keine Unterverzeichnisse wie Sie wollen . (Sie müssten die Ergebnisse durchlaufen, verwenden Sie is_dir () und rufen Sie dann Ihre Funktion erneut auf

Ссылка

%Vor%

Jeder andere Weg erfordert viel mehr Code als nötig, um etwas so Einfaches zu tun

    
RobertMaysJr 02.09.2012 06:54
quelle
2

Die Schritte sind so:

und opendir öffnen die Verzeichnisstruktur

$dh = opendir($dir)

Was Sie als nächstes tun, wird gelesen, was auch immer in $dh

steht

$file = readdir($dh)

Sie finden alle Informationen im PHP-Handbuch, die opendir

entsprechen

und googling zum Lesen der Struktur zurückgegeben dies

Ссылка

    
Tanmay 02.09.2012 06:27
quelle