Mailinglisten-Archive |
Hallo Liste, Auf einem Server habe ich eine Reihe von Ordnern und Unterordnern. Benutzer können über einen einfachen Verzeichnisbaum navigieren, allerdings sollen bestimmte Ordner nur für Benutzer mit entsprechendem Userlevel sichtbar sein. Zu jedem Ordner auf der Festplatte gibt es in einer MySQL-Datenbank einen Eintrag in der Tabelle "verzeichnisse" mit den Feldern "Pfad", "Datei" und "Level" (und natürlich einem Index "id"). Das sieht dann z.B. so aus: id - pfad - datei - level 1 - (leer) - Ordner01/ - 1 2 - Ordner01/ - unterordner_A/ - 1 3 - Ordner01/unterordner_A/ - Testordner_01/ - 3 4 - (leer) - Ordner02/ - 2 usw... Ich habe jetzt eine einfache Funktion geschrieben, welche rekursiv die Verzeichnisse auf der Festplatte durchgeht und so einen Baum ausgibt. function verzeichnisbaum($verzeichnis_pointer) { global $verzeichnis_ebene; global $n; if ($handle = opendir($verzeichnis_pointer)) { //Anfang While - solange wie das Dateihandle noch Daten liefert while (false !== ($file = readdir($handle))) { //Die "Navigations-Ordner" (. und ..) außen vor lassen if ($file == "." || $file == "..") { continue; } //Falls der Verzeichnis_Pointer nicht mit einem Slash aufhört, muss es angehängt werden if(substr($verzeichnis_pointer, -1, 1)!='/') { $verzeichnis_pointer = $verzeichnis_pointer . "/"; } $filetypetest = filetype($verzeichnis_pointer.$file); if ($filetypetest == "dir") { $verzeichnis_ebene++; $i = 0; while ($i < $verzeichnis_ebene) { echo "<img src=\"../images/icon_menu_spacer.gif\">"; $i++; } //Link zum Zielordner erzeugen $target_dir = $verzeichnis_pointer . $file . "/"; //Link fürs Listing erzeugen $target_dir2 = str_replace("./", "", $target_dir); $target_dir_listing = $phpself . "?dir=" . rawurlencode($target_dir2); echo "<a href=\"$target_dir_listing\"><img src=\"../images/icon_menu_ordner.gif\">$file</a><br>"; //Rekursion verzeichnisbaum($target_dir); } //Ende While } //Ende des Einlesens closedir($handle); $verzeichnis_ebene--; return 1; } else { return 0; } } Jetzt suche ich nach der peformantesten Möglichkeit, bei der Ausgabe des Baumes die Zugangslevel zu berücksichtigen und Ordner ggf. nicht auszugeben. In jedem Durchlauf der Rekursion eine neue Select-Abfrage abzusetzen stelle ich mir sehr unperformant vor, hab aber grade eine Denkblockade und mir will keine saubere, effektive Lösung einfallen :/ Tipps/Vorschläge/Lösungsansätze/Code willkommen! Danke im Voraus /Oliver -- "Feel free" - 10 GB Mailbox, 100 FreeSMS/Monat ... Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail -- "Feel free" - 10 GB Mailbox, 100 FreeSMS/Monat ... Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail
php::bar PHP Wiki - Listenarchive