![]() |
[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 |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Damit hatte ich es auch erst probiert, bin damit aber nicht ganz klar gekommen.
|
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Zitat:
Greetz alcaeus |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Den Beispielcode, den ich hatte, hat mir eine Art Verzeichnisbaum ausgegeben. Ich brauchte aber für jede Eben den vollen Pfad. Und das hab eich nicht hinbekommen. Des weiteren bin ich noch nicht so ganz durch die Klasse durchgestiegen, obwohl sie mir sehr praktisch erscheint. Ich habe mir für meine Homepage ein Upload Skript geschrieben, damit ich nicht immer den FTP-Client starten muss:
![]() |
AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
Moin,
den Dateinamen kriegst du mit $fileinfo->getFilename() raus, den Pfad mit $fileinfo->getPath() und den kompletten Pfad inkl. Dateiname mit $fileinfo->getPathname(). Hier mal ein Beispiel, welches auch gleich den root-Path rausschnibbelt:
Code:
Hinweis: code ist ungetestet und nicht in der IDE geschrieben....
/**
* Normalizes a pathname by cutting a root directory from the beginning * * @param string $pathname The path name to normalize * @param string $rootDirectory The root directory that will be cut from the pathname * * @return string The normalized pathname */ function normalizePathname ($pathname, $rootDirectory) { return preg_replace('#^' . preg_quote($rootDirectory, '#') .'#', '', $pathname); } /** * Returns a recursive directory listing * * @param string $directory The root directory for the listing * * @return array An array containing all children */ function getRecursiveDirectoryListing ($directory) { $children = array(); $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::SKIP_DOTS); foreach ($iterator as $child) { $children[] = normalizePathname($child->getPathname(), $directory); } array_multisort($children, SORT_ASC, $children); return $children; } Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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