Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Verzeichnisse rekursiv in ein Array schreiben (https://www.delphipraxis.net/160156-%5Bphp%5D-verzeichnisse-rekursiv-ein-array-schreiben.html)

Luckie 30. Apr 2011 00:05

[PHP] Verzeichnisse rekursiv in ein Array schreiben
 
Ich versuche gerade Verzeichnisse in ein Array zu schreiben:
Code:
<?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";
}

?>
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.

OK. Habs:
Code:
<?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";
}

?>
Bleibt noch das Problem mit dem Root Verzeichnis.

Luckie 30. Apr 2011 00:27

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
Mist, war doch nicht die Lösung. Jetzt ist es nicht mehr rekursiv.

himitsu 30. Apr 2011 00:38

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
PHP-Quellcode:
if (is_dir($verzeichnis.$datei))
{               
    dir_rekursiv($verzeichnis.$datei.'/');            
}
im ersten Code ... du mußt da natürlich das Ergebnis der Funktion mit an $dirs anhängen. :wink:

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";

Luckie 30. Apr 2011 01:12

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:

Warning: opendir(): open_basedir restriction in effect. File(/) is not within the allowed path(s): (/var/www/l3s11195:/usr/share/php) in /var/www/l3s11195/html/Privat/Dev/foo.php on line 6 Warning: opendir(/): failed to open dir: Operation not permitted in /var/www/l3s11195/html/Privat/Dev/foo.php on line 6 Warning: readdir() expects parameter 1 to be resource, boolean given in /var/www/l3s11195/html/Privat/Dev/foo.php on line 7 Warning: closedir() expects parameter 1 to be resource, boolean given in /var/www/l3s11195/html/Privat/Dev/foo.php on line 10 /
Ich brauche aber das Root-Verzeichnis meines HTML Ordners.

Und wenn ich es so aufrufe:
Code:
$dirs = dir_rekursiv($_SERVER["DOCUMENT_ROOT"].'/');
dann habe ich natürlich den Pfad zum DOCUMENT_ROOT dabei, was ich aber auch nicht brauchen kann.

Luckie 30. Apr 2011 02:51

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
OK, habe ihn mit str_replace rausgeschmissen. Aber ich habe noch ein Problem:
Code:
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";
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?

Matze 30. Apr 2011 06:51

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

Luckie 30. Apr 2011 07:11

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
:oops:

fkerber 30. Apr 2011 09:03

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

himitsu 30. Apr 2011 10:45

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
wegen dem strreplace könnte man jetzt auch den Suchpfade im Ergebnis gleich weglassen
PHP-Quellcode:
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']);
oder sagt sich, daß der übergebene Suchpfad nie relativ ist, sondern immer absolut "relativ" zum DocumentRoot

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('/');

alcaeus 1. Mai 2011 09:07

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben
 
Und noch ein Hinweis zu opendir() und Konsorten: seit einiger Zeit gibt es die DirectoryIterator, welche das Arbeiten mit Verzeichnissen erleichtert:
Code:
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        unlink($fileinfo->getPathname());
    }
}
Der angegebene Code z.B. loescht alle Dateien in einem Verzeichnis.
Um das Ganze rekursiv zu machen, gibt es z.B. die RecursiveDirectoryIterator-Klasse:
Code:
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isDir()) {
        rmdir($fileinfo->getPathname());
    } else {
        unlink($fileinfo->getPathname());
    }
}
Der Code macht das angegebene Verzeichnis rekursiv leer. Ist doch gleich viel schoener, oder? :)

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 02:16 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz