Directory- und filelisting problem

Schoenen guten Morgen zusammen :slight_smile:

Also, ich habe ein Problem beim auslesen der ordner und Dateien von Verzeichnissen auf meiner Website. Ich moechte, dass ein php-script die datein und ordner in einem Verzeichnis meines Webspaces erkennt und diese dann in form einer Aufstellung anzeigt.

Lösungsansätze hab ich bisher mehrere gehabt, sowohl mit scandir(), als auch mit opendir() / readdir(), nur bekomme ich ein Problem einfach nicht in die Reihe.

Nehmen wir mal folgenden Beispielpfad zur illustrierung:

“server\username\www”

in www befinden sich Dateien und auch ein ordner namens “ddd”, in ddd widerum befinden sich ebenfalls dateien und ein ordner names “bbb”.
Nun lasse ich via scandir() zB www auslesen und dateien und ordner in verschiedene arrays schreiben, diese arrays gehe ich dann in schleifen durch um eine ausgabe der dateinamen im verzeichnis zu bekommen. Das ganze funktiniert auch fuer www & auch die Dateien in ddd werden noch mit ausgegeben, allerding hackt es dann am ordner bbb!

Trotz if(is_dir) werden ab “server\username\www\ddd” sämtliche ordner nichtmehr als solche erkannt und wie dateien behandelt obwohl sie keine sind oO.

Ich haenge meine lösungsansaetze mal als Textdatein an, die nur den php teil beinhalten, der gesamte quellcode dafuer wuerde wohl zu viel auf einmal sein :wink:

Kann es sein, dass readdir und scandir auf maximal die 2te verzeichnisebene unterhalb des ausfuehrenden scriptes begrenzt sind, dass das nicht funktioniert?

Für Hilfe bin ich immer dankbar,
LG Hase

Ich habe gerade keine Lust, mir gezippte Dateien runterzuladen … deshalb vermute ich einfach mal:

Dann wirst du bei is_dir vermutlich den Pfad nicht vollständig angegeben haben, so dass is_dir das Argument gar nicht im Dateisystem finden kann - und was es nicht findet, das kann auch kein Verzeichnis sein, also liefert is_dir false.
Und daraus zieht dein Script dann wohl den Schluss, wenn es kein Verzeichnis ist, müsse es wohl eine Datei sein.

Also das, was ich geschrieben hab geht eigentlich folgende schritte durch:

Pfad einlesen:
falls ordner
neuen ordner einlesen
falls ordner …

Das Ganze ist eine schachtelung von ein und der selben abfolge, die halt bis zu 3 mal wiederholt werden kann (also bis auf maximal 2 unterverzeichnisse). Würdest Du dir die textdatein in den Zip`s angucken, haettest du das gesehen. Also daran, dass der pfad “falsch” sein koennte, kanns nicht liegen, weil dann auch die datein nicht richtig eingelesen werden wuerden und sich die relative angabe des pfades nur um eine variable zu ihrem vorgaenger unterscheidet und alles nach dem selben schema passiert, sprich er muesste wenn dann schon beim ersten unterverzeichnis rumzicken.

LG Hase

Jetzt hab’ ich reingeschaut … und hab’s auch so gut wie sofort bereut.

Lange nicht mehr so einen Murkscode gesehen.
Das ist mir eigentlich viel zu unübersichtlich und chaotisch, um mir überhaupt die Mühe zu machen, mich da rein zu denken.

Ich liebe Newbees, die zwar nicht überblicken können, was in ihren eigenen Scripten passiert - aber trotzdem alles besser wissen …

Nehmen wir mal das erste Script,

Das ist Zeile 13, Lesen aus der zweiten Ebene.

Und jetzt sagst du uns bitte, was eine Kontrollausgabe

die du vor dieser genannten Zeile 13 mit der if-Abfrage einfügst, ergibt.

Entschuldige bitte, dass es den Eindruck erweckt hat als wuerde ich es besser wissen wollen, das war nicht ganz so beabsichtigt, ich fand es nur … ein wenig unpassend, dass du so aus dem Blauen heraus mal eben vermutungen aufgestellt hast, ohne auch nur rein zu schaun.

Danke fuer deinen Hinweis, ich werde das gleich testen und dann hier rein editieren, was die ausgabe ergibt. Du hast recht, ich bin noch sehr neu auf dem Gebiet von PHP, aber das ich gar keinen plan hab würde ich so eher nicht sagen =/ jeder faengt mal klein an.

Das hat zwei Gründe.

Zum einen sind hochgeladene ZIP-Dateien nicht optimal, wenn man Hilfe sucht. Die muss sich jeder, der sich mit dem Problem beschäftigen will, erst mal runterladen und entpacken - damit legst du also die “Hürde” für Hilfswillige erst mal höher, als eigentlich nötig wäre. Es gibt andere Möglichkeiten, Codebeispiele bereitzustellen - erst mal direkt im Posting, oder wenn’s dafür zu viel wird, auch Services wie pastebin.ca/. Wobei man zu umfangreiche Codes sowieso nur im Ausnahmefall posten sollte - denn das reduzieren auf ein Minimalbeispiel, an dem das Problem nachvollziehbar bleibt, ist Aufgabe des Fragenden.

Und zum anderen deutet deine Problembeschreibung nun mal eindeutig in die Richtung, so dass mir meine Vermutung an der Stelle nicht zu gewagt erschien. Wenn is_dir Verzeichnisse “nicht erkennt”, und die Einträge dann vom Script “als Dateien behandelt” werden, weil das schlicht im else-Zweig steht - dann liegt es mit hoher Wahrscheinlichkeit daran, dass die Pfadangabe, die is_dir prüfen soll, einfach nicht stimmt, und es deshalb false liefert. Das macht es nämlich ohne weitere Warnmeldung, wenn der angegebene Pfad einfach nicht existiert - und daraus werden dann leicht falsche Schlüsse gezogen.

So, ich habe jetzt wie von dir empfohlen noch vor der ursprünglichen Zeile 13 eine überprüfung eingefügt, was das Ganze dann wie folgt ausshen lässt:

[code]
if($dir_2 = opendir($dir_x)){
while(false !== ($file_2 = readdir($dir_2))){
if(is_dir($file_2)){
echo ‘wir pruefen jetzt, ob das folgende ein Verzeichnis ist: "’.$file_1."/".$file_2.’"
’;
}

if($file_2[0] != “.” && is_dir($file_1.$file_2)){
echo “

$file_2

”;[/code]

Die ursprüngliche Zeile 13 habe ich durch 2 Leerzeilen mal “abgetrennt”.

Mit der von dir vorgeschlagenen Variante “’.$file_1.$file_2’” ergibt sich eine Ausgabe des Musters “Ordner…” , so, wie ich es jetzt habebekomme ich als Rückgabe “Ordner/…”

Was mich wundert ist, dass er zwar die “.” und “…” Verzeichnisse richtig als unterverzeichnisse erkennt, die von mir angelegten allerdings nicht.

Das ist nicht “die von mir vorgeschlagene Variante” - sondern die Variante, die du exakt so auch beim folgenden is_dir benutzt!

Eine solche Testausgabe hilft nur dann, wenn du auch exakt das testet, was zum fehlerhaften Verhalten führt. Und genau deshalb hatte ich die Variablenverkettung auch exakt so übernommen, wie sie bei dir im is_dir drin stand, $file_1.$file_2

Ach schau mal an, mit Slash dazwischen - warum hast du den rein gemacht, weil es damit irgendwie “richtiger” aussieht, so mit Slash zum Abtrennen von zwei Verzeichnisnamen voneinander, anstatt die beiden Verzeichnisnamen direkt hintereinander zu hängen …?
Dann wäre es vielleicht ganz clever, das ganze beim is_dir genau so zu machen, oder?

Da gibt es nichts zu “wundern”.

Du machst oben die Überprüfung nur mit is_dir($file_2), ohne $file_1 davor zu setzen.
Und da . und … in jedem Verzeichnis existieren, gibt es die an der Stelle auch - im aktuellen Verzeichnis, also liefert is_dir an der Stelle auch true. Bei deinen eigenen Unterverzeichnissen allerdings nicht, weil die im aktuellen Verzeichnis nicht existieren - die existieren erst dann, wenn du den Verzeichnisnamen aus $file_1 auch wieder davor setzt.

Sorry 4 Doppelpost:

Ich bin so ein … >.< … ich hab den wald vor lauter Bäumen nicht gesehen =/
Dass du mich quasie mit der Nase schon auf die Zeile 13 in meinem quelltext gestoßen hast ist mir eben erst richtig klar geworden, bzw warum er die von mir erstellten Verzeichnisse nicht schluckt wie er soll.

Die relative Pfadangabe zum allerersten Überverzeichnis hat gefehlt, weswegen dann ab der Unterebene 3 ein Fehler kommt. Ich hab diesen debuggingansatz deinerseits für mich mit der ausgabe von var_dump()`s fortgesetzt bis mir dann aufgefallen ist warum nach 2x true auf einmal false kam :confused: lang lang hats gedauert, vielen Dank für deine Hilfe :slight_smile:

nur mit $file_1 davor zu arbeiten haette nicht ausgereicht, selbst dann liefert is_dir() immernoch false.

Ooookay, ich dachte das Problem waere vollständig behoben, allerdings habe ich immernoch ein anderes Problem wie mir soeben auffiel =/

Hier erstmal der Stand des Quelcodes:
pastebin.ca/1492809

Das Problem nun ist, dass er ab den dritten unterverzeichnissen das array für die ordner trotz foreach-schleife so befüllt, dass er sowohl die ordner aus Überordner A und Überordner B in das array packt und sie auslesen will, da aber nicht in beiden Überordnern die gleichen verzeichnisse sind kommt es zu einem error.

Ich weiß nicht, wie ich diesem verhalten entgegensteuern soll und bräuchte nochmal hilfe =(

Das sieht dann wie folgt aus:

Verzeichnis “NeuerOrdner” ist in beiden Verzeichnissen vorhanden und auch die datei “Letzte seite …”, er ließt das einfach doppelt aus =/

LG Hase