open directory

Subwoover

Erfahrenes Mitglied
hey ich hab mal eine klasse geschrieben die sieht so aus:

PHP:
    class navigation {

        // Functions

        function check_dir($dir) {
	    $verz = opendir($dir);
	    $output = "";

	    while ($file = readdir($verz)) {
		if (($file == ".") OR ($file == "..")) {
		} else {
		    $output .= $file."<br>";
                } 
		if (is_dir($file)) {
		    $this->check_dir($dir."/".$file);
		}
	    }
	    closedir($verz);
	    return $output;
	}


	}

wenn ich die dann aufrufe:
PHP:
	echo $nav->check_dir("../");

dann kommt folgende Meldung:
PHP:
Warning: opendir(..//.././././in /webs/web42/html/elo/local/index.php on line 12

Warning: readdir(): supplied argument is not a valid Directory resource in /webs/web42/html/elo/local/index.php on line 15

Warning: closedir(): supplied argument is not a valid Directory resource in /webs/web42/html/elo/local/index.php on line 26

es wären noch mehr /. aber die hab ich hier mal gekürzt :)
Wenn ich das ganze ohne selbstaufrufen mache, funktioniert es!

Was mach ich falsch?! :)
wenn es verbesserungsvorschläge gibt nur her damit!
z.B: (($file == ".") OR ($file == ".."))
kann man doch sicher vereinfachen oder?
 
Zuletzt bearbeitet von einem Moderator:
PHP:
    class navigation {

        // Functions

        function check_dir($dir) {
	    $verz = opendir($dir);
	    $output = "";

	    while ($file = readdir($verz)) {
		if (($file == ".") OR ($file == "..")) {
		} else {
		    $output .= $file."<br>";
                } 
		if (is_dir($file)) // Endlos-Rekursion wenn $file == "." oder ".." !!!
                {
		    $this->check_dir($dir."/".$file);
		}
	    }
	    closedir($verz);
	    return $output;
	}


	}

Gruß
Falk
 
Zuletzt bearbeitet:
Original geschrieben von Subwoover
hey ich hab mal eine klasse geschrieben die sieht so aus:

PHP:
 function check_dir($dir) {
  $verz = opendir($dir);
  $output = "";

  while ($file = readdir($verz)) {
   if (($file[0] != ".") {
    $output .= $file."<br>";
    if (is_dir($file)) {
     $this->check_dir($dir."/".$file);
    }
   }
  }
  closedir($verz);
  return $output;
}

so sollte es gehen
 
@ Melmager: ich habs jez mal so ausprobiert wie du es hast und er gibt mir das aus:

.
..
index.php
local
index.html
index.php

ich hab folgende struktur:
ORDNER htdocs:
-index.html
-index.php
-ORDNER local
-index.php

mich würd interessieren wie ich a) das verzeichniss vor dem name der datei dazuausgebe und b) wie ich die punkte am anfang wegbekomme also das . und das ..
hmmm
bitte um help :(
 
Melmager, das ist etwas fahrlässig, was du da programmiert hast. Denk mal an Dateien wie ".htaccess", die also mit "." beginnen. Die werden nicht angezeigt.

Außerdem wird das Ergebnis des rekursiven Aufrufs von "check_dir()" nicht abgefangen, so dass das output, welches zurückgeliefert wird im Nirvana verschwindet.

Gruß
Falk
 
@vogtländer das was Absicht :-)

Dateien mit Punkt vorne dran sollten nicht angezeigt werden :-) das ist normal unter unix

----

B) die punkte sollten weg sein ---
A) wie soll denn die Ausgabe aussehen?
 
Zuletzt bearbeitet:
naja ich hätte gerne die punkte weg und den pfad + datei also in dem fall NUR die 2te index.php mit dem string local/index.php

also wenn es im gecheckten verzeichniss ein unterverzeichnis gibt dann soll er das vor den dateien in diesem unterverzeichnis angeben, und wenn dort noch ein weiteres unterverzeichnis ist dann dort eben das 1ste und das 2te verzeichnis + datei, ca so: bla/blu/index.php
 
Re: Re: open directory

PHP:
 function check_dir($path_str,$dir) {
  // $path_str ist eine Zeichenkette, die den Pfad angibt, 
  // der vor den Dateinamen geschrieben werden soll,
  // also z.B. "local/"

  $verz = opendir($dir);
  $output = "";

  while ($file = readdir($verz)) {
   if (($file[0] != ".") {
    $output .= $path_str.$file."<br>";
    // hier wird der Pfad einfach davor geschrieben.
    if (is_dir($file)) {
     $this->check_dir($path_str."/".$file,$dir."/".$file);
     // $path_str wird um den Namen des Subordners erweitert
     // und mit übergeben.
    }
   }
  }
  closedir($verz);
  return $output;
}

Wieso "." und ".." immernoch ausgegeben werden, ist mir ein Rätsel.

Gruß
Falk
 
hm es funktioniert schon recht gut...
. und .. werden nicht mehr ausgegeben allerdings wird der inhalt des ordners local auch nicht ausgegeben, ich hab da jetzt die auflistung des aktuellen ordners und von 3 elementen ist eins ein weitere ordner (local) und der inhalt von dem ordner wird aber nicht angezeigt....
 
Ach richtig, da hab ich doch den Fehler gemacht, den ich selbst bei melmager gefunden habe.

Du musst die Rückgabe von check_dir() auffangen, also
PHP:
$output.=$this->check_dir($path_str."/".$file,$dir."/".$file);

// statt
// $this->check_dir($path_str."/".$file,$dir."/".$file);

Gruß
Falk
 
Zurück