Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme bmp

recursivo não roda!

Recommended Posts

Olá!

 

Alguém consegue me exmplicar por que minha recursividade não funciona??

Digo, o código está tudo certo, estou fazendo um menu, que vai exibir todos arquivos, pastas, arquivos das pastas etc...

Mas isso não está recursivo!

Quando o código entra na primeira pasta, que acha, lista os arquivos dela e só, não está "voltando" a raiz e listando as outras pastas... ou seja, depois que chamo a funcao dentro dela mesma, o que está depois dessa chamada nunca mais é compilado..

 

Se alguem conseguir me ajudar ficarei grato!

 

<?php

	function recursive($dh){
	
		while (($file = readdir($dh)) !== false) {
		
			$quebra = explode('.', $file);
			$ext = strtolower(end($quebra));

			if (is_dir($file) && ($file != ".") && ($file != "..")) { //if it is a folder
				echo "<li>";
					echo $file; //folder name
			   			echo "<ul>";

								$dir = $file;
								$dh = opendir($dir);
								recursive($dh);
							//	closedir($dh);
			   			echo "</ul>";			   			
			 	echo "</li>";	   
			} //end if is folder
		   
 			if (($file != '.') && ($file != '..') && ($ext != $quebra[0]) && ($ext != false)) { //if it is a file
				 echo "<li>";
	   				echo "<a href=\"$dir/$file\">$file</a>";
	 			 echo "</li>";
			}//end if is file
 

		} //end while
	}//end function
	

	echo "<ul id=\"containerul\">";

		$file="";
		$dir = ".";
		if ($dh = opendir($dir)) {
			recursive($dh);
		}
	echo "</ul>";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um dos problemas pode ser que seja o fato de que na primeira chamada você passa o caminho + o nome do diretorio, nas chamadas recursivas você só está passando o nome do diretório, sem o caminho.

Mesmo na função is_dir() você tem que informar o caminho completo se não, eu acho, ela não funciona como esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um dos problemas pode ser que seja o fato de que na primeira chamada você passa o caminho + o nome do diretorio, nas chamadas recursivas você só está passando o nome do diretório, sem o caminho.

Mesmo na função is_dir() você tem que informar o caminho completo se não, eu acho, ela não funciona como esperado.

Ola.

Creio não ter entendido.

Na primeira chamada e nas chamadas recursivas, para mim, estou chamando do mesmo jeito... informando o diretório $dh, que no caso, é a única variável que vai ser usada na função recursiva...

eu vi na internet algo de usar $this-> ... será que tem haver? (nem sei como usar isso)

obrigado!

EDIT: Editei o código, eu estava pondo mais parâmetros atoa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh!

Não sei, como isso pode funcionar. Você inicia passando "." e depois seque como?

 

Se tiver uma estrutura tipo:

 

.

pasta01

 

O "." ele até pode entender como sendo um diretório, mas pasta01 não. E nem mesmo .pasta01

pasta01 teria que ser algo como /home/usr/pasta01, não sei o que se pode entende por diretório "."

 

Ainda to aprendendo descupem se escrevi alguma bobagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh!

Não sei, como isso pode funcionar. Você inicia passando "." e depois seque como?

 

Se tiver uma estrutura tipo:

 

.

pasta01

 

O "." ele até pode entender como sendo um diretório, mas pasta01 não. E nem mesmo .pasta01

pasta01 teria que ser algo como /home/usr/pasta01, não sei o que se pode entende por diretório "."

 

Ainda to aprendendo descupem se escrevi alguma bobagem.

 

"." é a pasta raiz, onde está localizada a página php... aí creio que se usar "." denovo volta uma pasta... acho q eh isso...

aí depois teoricamente iria entrar em todas as pastas...

e sim, creio que "pasta" pode ser um diretório, afinal de contas quando eu chamo

 

$dir = $file; // ($file = pasta)

$dh = opendir($dir);

 

Da certo... so que soh faz isso uma vez ne... nao esta recursivo... o problema é este creio eu. Se estivesse recursando estaria tudo certo...

 

Alguem tem outra sugestao?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a lógica montada está errda

 

 

veja um exemplo

 

<?php

$dir = '\\'; strpos( dirname(__FILE__), $dir ) ? '' : $dir = '/';
define( 'SLASH', $dir );
define( 'BASE_DIR', dirname(__FILE__) . SLASH );

	function folderList( $path = '' ){

		if( !defined('SLASH') ){
			$slash = '/';
		}else{
			$slash = SLASH;
		}

		if( $path == '' ){
			if( !defined('BASE_DIR') ){
			$path = dirname(__FILE__) . $path;
			}else{
			$path = BASE_DIR;
			}
		}

		$path = str_replace( SLASH . SLASH, SLASH, $path );

		$src  = @opendir( $path );
		$i	= 0;

		while( $file = @readdir( $src ) ){

			if( $file != '.' && $file != '..' ){

				if( @is_dir( $path . $file . $slash ) ){
					$type = 1;
					$mime = 'dir';
					$size = dirSize( $path . $file );
				}else{
					$size = filesize( $path . $file );
					$mime = @mime_content_type( $path . $file );
					$type = 2;
				}

				$rs[$type][$i]['type'] = $mime;
				$rs[$type][$i]['name'] = $file;
				$rs[$type][$i]['size'] = $size;
				$i++;
				/** for debug
				echo '<br><br>file ' . $file;
				echo '<br>mime ' . $mime;
				echo '<br>size ' . $size;
				echo '<br>path ' . $path . $file;
				echo '<br>type ' . $type;
				echo '<br>i ' . $i;
				*/
			}

		}
		@closedir( $src );

		if( $i > 0 ){
			return $rs;
		}else{
			return false;
		}

	}


	function dirSize( $dir ){
		$src  = opendir( $dir );
		$size = 0;
		while( $file = readdir( $src ) ){
			if( $file !=  "." && $file  !=  ".." ){
				$path = $dir . SLASH . $file;
				if( is_dir( $path ) ){
					$size += dirSize( $path );
				}else{
					$size += filesize( $path );
				}
			}
		}
		closedir( $src );
		return $size;
	}


$rs = folderList( BASE_DIR . 'nomePasta' . SLASH );
print_r( $rs );

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara... eu vou estudar aqui o código que você mandou, mas não tem como dizer por favor o que exatamente da lógica está errada não?

A lógica é a seguinte:

 

FUNCTION (diretório)

	WHILE (houver arquivos){
		
		IF o arquivo for uma pasta{
		
			imprime nomeDoArquivo (que é pasta)
			diretório = nomeArquivo;
			FUNCTION (diretorio)	
		}
		
		IF o arquivo for um arquivo{
		
			imprime nomeDoArquivo
		}

	}//end while
}// end function

diretório = ".";
FUNCTION (diretorio);

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, a lógica está certa, mas você interpretou errado no php

 

apenas uma dica.

tome cuidado quando fizer testes com loops e chamadas recursivas

 

é comum errar enquanto desenvolve, portanto coloque no inico do codigo um tempo limite de 5 segundos de execução

 

evite também o uso de realpath()

 

utilize dirname(__FILE__)

 

__FILE__ é uma das constantes mágicas do php

 

http://www.php.net/manual/en/language.cons....predefined.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, a lógica está certa, mas você interpretou errado no php

 

apenas uma dica.

tome cuidado quando fizer testes com loops e chamadas recursivas

 

é comum errar enquanto desenvolve, portanto coloque no inico do codigo um tempo limite de 5 segundos de execução

 

evite também o uso de realpath()

 

utilize dirname(__FILE__)

 

__FILE__ é uma das constantes mágicas do php

 

http://www.php.net/manual/en/language.cons....predefined.php

Hino,

 

você está sugeringo usar "dirname(__FILE__)" ao invés de que no meu código? Não entendi muito bem o funcionamento do _FILE_

Desculpe a ignorancia em tratar arquivos, mas é porque eu estou editando um código pronto que achei.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando utilizar realpath, prefira usar dirname

 

realpath retorna o valor real do local onde a execução do script é feita

 

por exemplo, se excutar o php em linha de comando usando windows, o realpath retornará o local da pasta system32

aí já é outra história

 

por enquanto, procure sempre usar dirname(__FILE__)

 

 

consulte o manual para mais detalhes

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando utilizar realpath, prefira usar dirname

 

realpath retorna o valor real do local onde a execução do script é feita

 

por exemplo, se excutar o php em linha de comando usando windows, o realpath retornará o local da pasta system32

aí já é outra história

 

por enquanto, procure sempre usar dirname(__FILE__)

 

 

consulte o manual para mais detalhes

Mas se eu usar apenas dirname(__FILE__) irá sempre retornar o mesmo diretório, o diretório de onde a execução é feita.

Mas eu preciso de na função mudar o diretório para listagem dos arquivos dos sub diretórios.

Há como o __FILE__ funcionar desse jeito?

Compartilhar este post


Link para o post
Compartilhar em outros sites

__FILE__ é uma constante mágica

 

retorna o nome do arquivo que executa o script

 

dirname retorna o caminho do diretorio de uma string

 

exemplo:

suponha o path

 

c:/www/script.php

 

dirname(__FILE__);

 

retornará c:/www

 

pra navegar entre outras pastas

 

 

dirname(__FILE__) . '/../'

 

recua 1 folder

 

é o mesmo que realpath faz, porém realpath retorna o caminho real do aplicativo que executa o script

dirname retorna o caminho real do aquivo que contém o script

 

 

é apenas uma dica.

faça o que for conveniente

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.