Ich möchte eine Liste aller Unterverzeichnisse bekommen und mein Code unten funktioniert, außer, wenn ich nur lesbar Berechtigungen für bestimmte Ordner haben.
In der Frage unten zeigt es, wie ein Verzeichnis mit RecursiveDirectoryIterator überspringen Kann ich RecursiveDirectoryIterator unlesbare Verzeichnisse überspringt? aber mein Code ist etwas anders hier und ich bin nicht in der Lage, das Problem zu umgehen.
%Vor%Ich bekomme den Fehler
%Vor%Ich habe versucht, es mit der akzeptierten Antwort in der anderen Frage zu ersetzen.
%Vor%Allerdings wird dieser Code geben Sie mir eine Liste aller Verzeichnisse innerhalb von www wie ich will, wo ich falsch geht hier vor?
Einführung
Das Hauptproblem mit Ihrem Code ist die Verwendung von CHILD_FIRST
Optionaler Modus Mögliche Werte sind
- RecursiveIteratorIterator :: LEAVES_ONLY - Der Standardwert. Listet nur Blätter in Iteration.
- RecursiveIteratorIterator :: SELF_FIRST - Listet Blätter und Eltern in Iteration auf, wobei die Eltern zuerst kommen.
- RecursiveIteratorIterator :: CHILD_FIRST - Listet Blätter und Eltern in Iteration mit Blättern, die zuerst kommen.
Was Sie verwenden sollten, ist SELF_FIRST
, so dass das aktuelle Verzeichnis enthalten ist. Sie haben auch vergessen, die optionalen Parameter RecursiveIteratorIterator::CATCH_GET_CHILD
Optionale Markierung Mögliche Werte sind RecursiveIteratorIterator :: CATCH_GET_CHILD, die dann Ausnahmen ignorieren, die in Aufrufen von RecursiveIteratorIterator :: getChildren () ausgelöst wurden.
Ihr CODE wurde erneut besucht
%Vor% Sie möchten wirklich CHILD_FIRST
Wenn Sie wirklich die CHILD_FIRST
Struktur beibehalten wollen, dann empfehle ich Ihnen, ReadableDirectoryIterator
Beispiel
%Vor%Verwendete Klasse
%Vor%Ich habe folgende Verzeichnisstruktur eingerichtet:
%Vor% Ich habe den folgenden Code ausgeführt (ich habe das Flag SKIP_DOTS
hinzugefügt, um .
und ..
btw zu überspringen):
Es gibt Folgendes aus:
%Vor%Dies funktioniert wie erwartet.
Aktualisieren
Hinzugefügt die Flags, die Sie in Ihrem ursprünglichen Beispiel hatten (obwohl ich glaube, dass diese sowieso Standard sind):
%Vor%Ausgabe:
%Vor%Dieser Code funktioniert 100% ...
Sie können diese Funktion einfach verwenden, um nach Dateien und Ordnern in Ihrem gewünschten Verzeichnis oder Laufwerk zu suchen. Sie müssen nur den Pfad des gewünschten Verzeichnisses in die Funktion eingeben. Der zweite Parameter der Funktion ist der vollständige Pfad der gescannten Dateien und Ordner. Falscher Wert des zweiten Parameters bedeutet, dass der vollständige Pfad nicht angezeigt wird.
Das Array $ ignore wird verwendet, um einen beliebigen Dateinamen oder Ordnernamen aus der Liste auszuschließen.
Die Funktion gibt das Array zurück, das die Liste der Dateien und Ordner enthält.
Diese Funktion überspringt die Dateien und Ordner, die während der Rekursion nicht lesbar sind.
Die Funktion glob überspringt Lesefehler automatisch und sollte auch Ihren Code ein wenig vereinfachen. p>
Wenn Sie unbehandelte Ausnahmen bekommen, warum bringen Sie diesen Code nicht in einen try-Block, mit einem Ausnahme-catch-Block, um Fehler zu finden, wenn er keine Verzeichnisse lesen kann? Nur ein einfacher Vorschlag, indem Sie Ihren Code und Ihr Problem betrachten. Es gibt wahrscheinlich einen besseren Weg, es in PHP zu tun.
Sie müssen SELF_FIRST
constant verwenden, wenn Sie den Namen des unlesbaren Verzeichnisses zurückgeben möchten.
Wenn Sie CHILD_FIRST
ausführen, versucht es, in das Verzeichnis zu gelangen, schlägt fehl und der aktuelle Verzeichnisname ist nicht enthalten.
Was ist mit try? Fange die UnexpectedValueException. Vielleicht gibt es sogar einen eindeutigen Ausnahmecode für diesen Fehler, den Sie überprüfen können. Andernfalls können Sie die Ausnahmebedingungsnachricht für "Berechtigung verweigert" analysieren.
Ich würde vorschlagen, die Ссылка
zu prüfenTags und Links php directory directory-walk