Unterverzeichnisse mit einbeziehen

ahnernoch

Mitglied
Kann mir vielleicht einer weiter helfen wie ich folgendes abändern muss damit er auch unterverzeichnisse mit einbezieht? Der Code erstellt ein shuffle playlist in einem in der html angegebenen ordner. Allerdings nimmt er keine Unterverzeichnisse mit hinein. Er scannt nur in dem Ordner selbst.

Code:
<?
$dir =$_GET['dir'];
$files = array();

$allowedE = array(
  "mpg",
  "avi",
  "divx",
  "mov",
  "mpeg2",
  "mkv",
  "ts",
  "ps",
  "mp4",
  "mp2"
);

function filter($path, $aE)
{
    $ext = end(explode(".", $path));    
	if (in_array($ext, $aE)) 
	{
		return true;
	}
	else
	{
		return false;
	}
}

if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) 
	{
		if (filter($file, $allowedE))
		{
			$files[] = 'file://'.$dir.'/'.$file;
        }
    }
    closedir($handle);
}
shuffle($files);
foreach ($files as $key => $value)
{
	echo 'shuffle|0|0|'.$value.'|';
}
?>
 
Du musst das Ordner durchsuchen in eine funktion packen die sich pro unterordner selber aufruft

PHP:
<?php
$dir =$_GET['dir'];
$files = array();

$allowedE = array(
  "mpg",
  "avi",
  "divx",
  "mov",
  "mpeg2",
  "mkv",
  "ts",
  "ps",
  "mp4",
  "mp2"
);

function filter($path, $aE)
{
    $ext = end(explode(".", $path));    
    if (in_array($ext, $aE)) 
    {
        return true;
    }
    else
    {
        return false;
    }
}

// neu als Funktion
function getFiles($dir){
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) 
        {
            //Wenn es ein Ordner ist, die Funktion rekursiv öffnen
            if (is_dir($file)) getFiles($dir)
            if (filter($file, $allowedE))
            {
                $files[] = 'file://'.$dir.'/'.$file;
            }
        }
        closedir($handle);
    }
    return $files;
}
//Aufruf der Funktion
$files = getFiles($dir);
shuffle($files);
foreach ($files as $key => $value)
{
    echo 'shuffle|0|0|'.$value.'|';
}
?>
 
Sieht eigentlich gut aus. Dank dir auf jedenfall schonmal. Nur er schmeißt ein Fehler in Zeile 38:

Code:
               if (filter($file, $allowedE))

haste noch eine Idee?
 
Zuletzt bearbeitet:
Bitte immer die Fehlermeldung hier posten. ;)
PHP:
if (is_dir($file)) getFiles($dir);
Dort fehlte das abschließende Semikolon.

Edit:
Zu langsam... :(
 
Kann den Fehler schlecht posten da die Files auf meinem Network Media Player laufen im Wohnzimmer.

Also das Script startet nun aber es läuft nun schon 5 Minuten. Habe das Gefühl das irgendwie in einem endlos Prozess steckt.

Kann es sein das er immer wieder das gleich Verzeichnis aufs neue liest?
 
Zuletzt bearbeitet:
Richtig. Hab noch ein Fehler entdeckt -> glaub nie einem Code blind *g*

natürlich muss $file übergeben werden und nicht $dir
PHP:
if (is_dir($file)) getFiles($file);
 
Wenn wir schon dabei sind:
Müsste es nicht so heißen?
PHP:
if (is_dir($dir . '/' . $file)) getFiles($dir . '/' . $file);
readdir() gibt doch nur den Namen des Elements, also ohne den Pfad, zurück. Ansonsten sucht er das Element doch in dem Verzeichnis, in dem das Skript ausgeführt wird und nie in den Unterverzeichissen, was auch wieder ein Fehler wären.

Um dann eine bessere Übesicht zu bekommen, wäre es vielleicht sinnvoll, den kompletten Pfad in einer Variable zu speichern, um nicht immer wieder neu verbinden zu müssen.
 
Zuletzt bearbeitet:
Es ist noch mehr falsch.
PHP:
<?php
$dir = $_GET['dir'];
$files = array();

$allowedE = array(
  "mpg",
  "avi",
  "divx",
  "mov",
  "mpeg2",
  "mkv",
  "ts",
  "ps",
  "mp4",
  "mp2"
);

function filter($path, $aE)
{
    $ext = end(explode(".", $path));    
    if (in_array($ext, $aE)) 
    {
        return true;
    }
    else
    {
        return false;
    }
}

// neu als Funktion
function getFiles($dir, &$files){
	global $allowedE;
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) 
        {
			if($file == '.' || $file == '..')
				continue;
				
			$path = $dir.'/'.$file;
            //Wenn es ein Ordner ist, die Funktion rekursiv öffnen
            if (is_dir($path))
            {
                        getFiles($path, $files);
            }
            else if (filter($path, $allowedE))
            {
                $files[] = 'file://'.$path;
            }
        }
        closedir($handle);
    }
}
//Aufruf der Funktion
getFiles($dir, $files);
shuffle($files);
foreach ($files as $key => $value)
{
    echo 'shuffle|0|0|'.$value.'|';
}
?>

1.
PHP:
global $allowedE;
in Zeile 33 ist nicht gerade schön, aber nötig, damit das globale Array gefunden wird
2. Das gleiche gilt auch für "files, das habe ich aber auf einen anderen Weg gelöst.
3. Das mit dem Pfad, wie schon oben angesprochen
3. Die Elemente '.' und '..' habe ich rausgefiltert. Macht nur Probleme ;)

Ich würde dir empfehlen, dass du dir zum testen des Scriptes lokal eine kleine Testumgebung einrichtest, damit du auch die Fehlermeldungen bekommst. Da stand nämlich alles schwarz auf weiß, was falsch war.


Edit:
Bitt Editiere deine Beiträge Tripple-Post.. da können manche allergisch reagieren und ist, soweit ich weiß, auch gegen die Regeln.

Edit2:
Kleine Anpassung vorgenommen.
 
Zuletzt bearbeitet:
Zurück