AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] Verzeichnisse rekursiv in ein Array schreiben

[PHP] Verzeichnisse rekursiv in ein Array schreiben

Ein Thema von Luckie · begonnen am 30. Apr 2011 · letzter Beitrag vom 1. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.317 Beiträge
 
Delphi 2006 Professional
 
#1

[PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 00:05
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.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (30. Apr 2011 um 00:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.317 Beiträge
 
Delphi 2006 Professional
 
#2

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 00:27
Mist, war doch nicht die Lösung. Jetzt ist es nicht mehr rekursiv.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 00:38
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.

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";
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (30. Apr 2011 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.317 Beiträge
 
Delphi 2006 Professional
 
#4

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 01:12
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.317 Beiträge
 
Delphi 2006 Professional
 
#5

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 02:51
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.987 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 06:51
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.
Wenn du so spät/früh nichts auf die Reihe kriegst, mach's wann anders.

Grüße
Matze
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.317 Beiträge
 
Delphi 2006 Professional
 
#7

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 07:11
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.717 Beiträge
 
Delphi XE Professional
 
#8

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 09:03
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 30. Apr 2011, 10:45
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('/');
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (30. Apr 2011 um 10:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: Dietersheim b. München
6.536 Beiträge
 
#10

AW: [PHP] Verzeichnisse rekursiv in ein Array schreiben

  Alt 1. Mai 2011, 09:07
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf