Anmerkung zu functions.upl.php: uplRecursiveDirectoryList

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Anmerkung zu functions.upl.php: uplRecursiveDirectoryList

Beitrag von HerrB » Sa 26. Mär 2005, 22:36

Das ist der Code zu uplRecursiveDirectoryList in functionsupl.php:

Code: Alles auswählen

function uplRecursiveDirectoryList ($directory, &$rootitem, $level)
{
	$dirhandle = @opendir($directory);
	
	if (!$dirhandle)
	{
	} else {
	
		unset($files);
		
        //list the files in the dir
        while ($file = readdir ($dirhandle))
        {
        	if ($file != "." && $file != "..")
        	{
        		if (@chdir($directory.$file."/"))
            	{
            		$files[] = $file;
            	}
        	}
        }
        
        
        if (is_array($files))
        {
        	sort($files);
        	foreach ($files as $key => $file)
        	{
                /* We aren't using is_dir anymore as that function is buggy */
            	$olddir = getcwd();
            	if ($file != "." && $file != "..")
            	{
            		if (@chdir($directory.$file."/"))
            		{
                		unset($item);
                		$item = new TreeItem($file, $directory.$file."/",true);
                		$item->custom["level"] = $level;
                		
                		if ($key == count($files)-1)
                		{
                			$item->custom["lastitem"] = true;
                		} else {
                			$item->custom["lastitem"] = false;
                		}
                		
                		$item->custom["parent"] = $directory;
                		
                		$rootitem->addItem($item);
                		$old = $rootitem;
                		uplRecursiveDirectoryList($directory.$file."/", $item, $level + 1);
                		$rootitem = $old;
                		chdir($olddir);
                	}
            	}
        	}	
        }
	}
	
    @closedir ($dirhandle);
}
Sie funktioniert, aber so richtig verstehe ich den Code nicht, gerne nehme ich Erläuterungen an:

Der Codeteil:

Code: Alles auswählen

while ($file = readdir ($dirhandle))
        {
        	if ($file != "." && $file != "..")
        	{
        		if (@chdir($directory.$file."/"))
            	{
            		$files[] = $file;
            	}
        	}
        }
wechselt IMHO zum einen das aktuelle Verzeichnis, ohne es wieder zurückzustellen und listet außerdem in $files nur Verzeichnisse auf (Test über @chdir). Wenn ja, dürfte die Überprüfung auf . und .. im darauffolgenden Code eigentlich entfallen dürfen.

Könnte die Funktion nicht so aussehen:

Code: Alles auswählen

function uplRecursiveDirectoryList ($directory, &$rootitem, $level)
{
	$dirhandle = @opendir($directory);
	
	if (!$dirhandle)
	{
	} else {
		unset($files);
		
        	//list the files in the dir
	        $olddir = getcwd();
        	while ($file = readdir ($dirhandle))
	        {
        		if ($file != "." && $file != "..")
        		{
        			if (@chdir($directory.$file."/"))
	            		{
        	    			$files[] = $file;
	            		}
        		}
		}
        	@chdir($olddir);
        
		if (is_array($files))
		{
        		sort($files);
	        	foreach ($files as $key => $file)
        		{
                		/* We aren't using is_dir anymore as that function is buggy */
		            	$olddir = getcwd();
            			if (@chdir($directory.$file."/"))
		            	{
                			unset($item);
		                	$item = new TreeItem($file, $directory.$file."/",true);
                			$item->custom["level"] = $level;
                		
		                	if ($key == count($files)-1)
                			{
                				$item->custom["lastitem"] = true;
		                	} else {
                				$item->custom["lastitem"] = false;
                			}
                		
		                	$item->custom["parent"] = $directory;
                		
                			$rootitem->addItem($item);
		                	$old = $rootitem;
                			uplRecursiveDirectoryList($directory.$file."/", $item, $level + 1);
		                	$rootitem = $old;
				}
                		@chdir($olddir);
            		}
        	}	
	}
	@closedir ($dirhandle);
}
Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 31. Mär 2005, 18:30

nun ja
es sollte innerhalb der funktion zu beginn ein

Code: Alles auswählen

$olddir = getcwd();
und am ende ein

Code: Alles auswählen

chdir($olddir);
reichen...

das zweimalige zurückstellen ist meiner meinung nach nicht notwendig...

beim zweiten mal die überprüfung auf . und .. im code könnte man wirklich kicken... (womit du recht hast)
*** make your own tools (wishlist :: thx)

Antworten