![]() |
[PHP] Verzeichnisse rekursiv in ein Array schreiben
Ich versuche gerade Verzeichnisse in ein Array zu schreiben:
Code:
Leider gibt er mir nur das angegeben Verzeichnis aus. Und wie kann ich den Root angeben? Wenn ich '/'angebe, dann sagt er mir, dass er das Verzeichnis nicht öffnen können.
<?php
$dirs = Array(); $count = 0; function dir_rekursiv($verzeichnis) { $handle = opendir($verzeichnis); while ($datei = readdir($handle)) { if ($datei != "." && $datei != "..") { if (is_dir($verzeichnis.$datei)) { dir_rekursiv($verzeichnis.$datei.'/'); } } } $dirs[$count] = $verzeichnis; $count++; closedir($handle); return $dirs; } $dirs = dir_rekursiv('../../'); foreach ($dirs as $dir) { echo "$dir<br>\n"; } ?> OK. Habs:
Code:
Bleibt noch das Problem mit dem Root Verzeichnis.
<?php
$dirs = Array(); $count = 0; function dir_rekursiv($verzeichnis) { $handle = opendir($verzeichnis); while ($datei = readdir($handle)) { if ($datei != "." && $datei != "..") { if (is_dir($verzeichnis.$datei)) { $dirs[$count] = $verzeichnis.$datei; $count++; dir_rekursiv($verzeichnis.$datei.'/'); } } } closedir($handle); return $dirs; } $dirs = dir_rekursiv('../../'); foreach ($dirs as $dir) { echo "$dir<br>\n"; } ?> |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Mist, war doch nicht die Lösung. Jetzt ist es nicht mehr rekursiv.
|
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
PHP-Quellcode:
im ersten Code ... du mußt da natürlich das Ergebnis der Funktion mit an $dirs anhängen. :wink:
if (is_dir($verzeichnis.$datei))
{ dir_rekursiv($verzeichnis.$datei.'/'); } oder du machst $dirs global und läßt das Result weg. (bei dir sind sie nur lokal und vollkommen unabhängig von der "globalen" Variable)
PHP-Quellcode:
function dir_rekursiv($verzeichnis) {
//$dirs = array(); $dirs[] = $verzeichnis; $handle = opendir($verzeichnis); while ($datei = readdir($handle)) if ($datei != "." && $datei != ".." && is_dir($verzeichnis.$datei)) $dirs = array_merge($dirs, dir_rekursiv($verzeichnis.$datei.'/')); closedir($handle); return $dirs; } $dirs = dir_rekursiv('../../'); foreach ($dirs as $dir) echo "$dir<br>\n"; |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Autsch. Es ist schon spät und man sollte nebenbei nicht per SMS flirten. ;) Aber wie gebe ich das Root-Verzeichnis an? Mit '/' bekomme ich folgende Warnung:
Zitat:
Und wenn ich es so aufrufe:
Code:
dann habe ich natürlich den Pfad zum DOCUMENT_ROOT dabei, was ich aber auch nicht brauchen kann.
$dirs = dir_rekursiv($_SERVER["DOCUMENT_ROOT"].'/');
|
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
OK, habe ihn mit str_replace rausgeschmissen. Aber ich habe noch ein Problem:
Code:
Ich benutze die Funktion von himitsu, aber in der Listbox ist immer noch eine Leerzeile zwischen den Verzeichnissen. Wo kommen die Leerzeile her und wie bekomme ich sie weg?
echo "<select name='dir' size='10'>\n";
foreach ($dirs as $dir) if ($dir != '\n') { $dir = str_replace($_SERVER["DOCUMENT_ROOT"].'/', '', $dir); echo "<option>$dir<option>\n"; } echo "</select>\n"; |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Valides HTML wäre hier nicht so schlecht.
Also nicht "<option>$dir<option>" sondern "<option>$dir</option>" Und schieb's nicht wieder auf die Uhrzeit. :tongue: Wenn du so spät/früh nichts auf die Reihe kriegst, mach's wann anders. :mrgreen: Grüße Matze |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
:oops:
|
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Hi,
bzgl. der Root-Dir-Problematik eine kurze Erläuterung: Mit "/" versuchst du wirklich das Root-Dir zu bekommen, allerdings eben das des Servers und das erlaubt man dir natürlich nicht. Das mit dem Document-Root ist also schon der richtige Weg. Ich habe mir die Funktion jetzt nicht im Detail angeschaut, aber sollte es nicht machbar sein, dass du zum Durchgehen den Pfad mit Document-Root benutzt, aber in der Ausgabe nur die Ordner auflistest? Der Weg mit str_replace erscheint mir etwas umständlich. LG, Frederic |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
wegen dem strreplace könnte man jetzt auch den Suchpfade im Ergebnis gleich weglassen
PHP-Quellcode:
oder sagt sich, daß der übergebene Suchpfad nie relativ ist, sondern immer absolut "relativ" zum DocumentRoot
function dir_rekursiv($verzeichnis, $innerer_pfad = '') {
if ($verzeichnis && (substr($verzeichnis, -1) != '/')) $verzeichnis .= '/'; $dirs = array(); $handle = opendir($verzeichnis . $innerer_pfad . '.'); while ($datei = readdir($handle)) if (($datei != '.') && ($datei != '..') && is_dir($verzeichnis . $innerer_pfad . $datei)) { $dirs[] = $innerer_pfad . $datei; $dirs = array_merge($dirs, dir_rekursiv($verzeichnis, $innerer_pfad . $datei . '/')); } closedir($handle); return $dirs; } $dirs = dir_rekursiv($_SERVER['DOCUMENT_ROOT'] . '/'); # oder $dirs = dir_rekursiv($_SERVER['DOCUMENT_ROOT']);
PHP-Quellcode:
function dir_rekursiv($verzeichnis) {
if ($verzeichnis && (substr($verzeichnis, -1) != '/')) $verzeichnis .= '/'; if (substr($verzeichnis, 0, 1) != '/')) $verzeichnis = '/' . $verzeichnis; $dirs = array(); $handle = opendir($_SERVER['DOCUMENT_ROOT'] . $verzeichnis . '.'); while ($datei = readdir($handle)) if (($datei != '.') && ($datei != '..') && is_dir($_SERVER['DOCUMENT_ROOT'] . $verzeichnis . $datei)) { $dirs[] = $verzeichnis . $datei; $dirs = array_merge($dirs, dir_rekursiv($verzeichnis . $datei . '/')); } closedir($handle); return $dirs; } $dirs = dir_rekursiv('/'); |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Und noch ein Hinweis zu opendir() und Konsorten: seit einiger Zeit gibt es die
![]()
Code:
Der angegebene Code z.B. loescht alle Dateien in einem Verzeichnis.
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) { if ($fileinfo->isFile()) { unlink($fileinfo->getPathname()); } } Um das Ganze rekursiv zu machen, gibt es z.B. die ![]()
Code:
Der Code macht das angegebene Verzeichnis rekursiv leer. Ist doch gleich viel schoener, oder? :)
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iterator as $fileinfo) { if ($fileinfo->isDir()) { rmdir($fileinfo->getPathname()); } else { unlink($fileinfo->getPathname()); } } Ausserdem gibt es zum sinnvollen Arbeiten mit den $fileinfo-Objekten geschickte Methoden: isDot(), isExecutable(), isFile(), isLink(), sowie Methoden zum Holen von Filetimes, etc. Das erspart es dir, OS-spezifische Dinge in deinen Code einzubauen. Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz