Php y Directorios :: Ayuda !!!

YaMuNa

New member
Mensajes
89
Puntos de reacción
0
Puntos
0
Hola, estoy haciendo una pequeña tarea por así decirlo. Lo que quiero hacer es listar todos los archivos que puedan haber dentro de una carpeta usando php. El código que estoy utilizando es el siguiente:

Código:
<?php

$dir = "files/";
$file = scandir($dir);
$qty = count($file);

for ($i=0; $i < $qty ; $i++) { 
	if ($file[$i] == '.' || $file[$i] == '..' || $file[$i] == '.DS_Store') {
		continue;
	}
	else {
		echo $file[$i]. '</br>';
	}
}

?>

Hasta ahi todo me funciona perfecto, devolviéndome lo siguiente:

04.mp3
05.mp3
06.mp3
First.mp3
Other
Second.mp3
Third.mp3

Mi problema es que el directorio Other también contiene archivos, pero no me los muestra. Que puedo hacer para que me muestre también el contenido de los subdirectorios que tiene el directorio que estoy escaneando?? Existe alguna forma de organizar el resultado, mostrando los directorios primero y después los archivos? Gracias.
 
El concepto que debes estudiar es recursividad.
Tambien necesitas conocer lo basico de la programacion orientada a objetos en PHP, ya que los resultados es impresindible guardarlos en una propiedad de la clase "n" (o sea la clase que definas)
Para poder "mapear" un directorio tu codigo necesita iterar una y otra vez de forma automatica sobre un directorio raiz y guardar lo que vaya encontrando. En este caso archivos mp3.
Cuando mencionas recursividad es necesario tambien hablar de la pila o stack y como funciona.

Aca te dejo un ejemplo con el que he desarrollado, CYBERmusic y AudioBook.
Código:
public function allSongs($dir){
			if ( is_dir($dir) ){ 
				
				$d = opendir($dir); 
				
				while( $entry = readdir($d) ){ 
				  
					if ( $entry != "." && $entry != ".."  ){ 
						
						if(is_file($dir.'\\'.$entry)){
								
							foreach($this->fileext as $ext){
								
								if($ext == pathinfo($dir.'/'.$entry, PATHINFO_EXTENSION)){
									
									$this->songs[] = $dir.'\\'.$entry;
									
								}
								
							}
							
						}
						
						$this->allSongs($dir.'\\'.$entry); 
					
					
					}
				}  
			}
		}
 
Código:
<?php

function rscandir($base='', &$data=array()) {
 
  $array = array_diff(scandir($base), array('.', '..', '.DS_Store'));
  
  foreach($array as $value) :
 
    if (is_dir($base.$value)) : $data[] = $base.$value.'/';

      $data = rscandir($base.$value.'/', $data); 

    elseif (is_file($base.$value)) : $data[] = $base.$value;
     
    endif;
   
  endforeach;
 
  return $data;
 
}

foreach ((rscandir(dirname(__FILE__).'/files/')) as $dat) {
	echo $dat. '</br>';
}


?>

Esto fue lo que termine haciendo. De todas formas muchas gracias DvD, me fue muy util tu post...
 
pero eso sigue sin resolverte el problema, ahi solo vas a coger el primer nivel de carpetas, si tienes una carpeta dentro de esas subcarpetas pues no te servira. Por ello es que se usa recursividad y la respuesta de dvd es la adecuada, lo que hiciste fue mas bien un parche a tu problema pero no es una solucion
 
tengo que probar con la solución de DvD pero esto que hice escanea varios niveles de carpetas....
 
YaMuNa dijo:
tengo que probar con la solución de DvD pero esto que hice escanea varios niveles de carpetas....

ufff si sorry, sorry q con el suenno de anoche y el apuro no me fije bien en el nombre de la funcion y al final si haces recursividad, habia interpretado esa funcion como que era una funcion de php pero al final resolviste como mismo te recomendo dvd asi q si, esta bien eso solo q yo andaba dormio jajaja
 
No esta mal...pero que enrredá te das...
A veces conocer el tema te ayuda a simplificar las cosas
Slds
 
si, es verdad que me enrede un poco, jejeje, por eso voy a probar el tuyo en cuanto tenga un tiempo, esta mas optimizado y limpio, y si al final hace lo mismo......
 
Atrás
Arriba