Arquivos em Árvore PHP

67 views
Skip to first unread message

Luis Techio

unread,
Jul 2, 2015, 1:54:17 PM7/2/15
to lista...@googlegroups.com
Olá galera!

Quero implementar no meu sistema web, uma função de anexos. Preciso listar os arquivos em árvore de um diretório, com PHP.

Estou tentando implementar um exemplo que encontrei na net mas da forma em que eu estou fazendo, pois terei que fazer um foreach para cada subnível do diretório... Estou usando o plugin JS-Tree para deixar estilizado. Sou bem iniciante em PHP, se alguem puder dar uma ajuda, agradeço muito! Esse é o código de teste que eu tenho atualmente:

<?php
define('DS', DIRECTORY_SEPARATOR);
define('RAIZ', '/var/www');
define('GERAIS', RAIZ.'/');
define('FUNCIONARIOS', GERAIS.'/');

function escaneiaDiretorio($root){
        $ponteiro  = scandir($root);
$count = count($ponteiro);
echo $count;
foreach($ponteiro as $lista){
if($lista !="." && $lista!=".."){
if (is_dir($root.DS.$lista))
$pastas[]=$lista; 
else 
$arquivos[]=$lista;
}
}
$geral[0] = $pastas;
$geral[1] = $arquivos;
return $geral;
}

$nivel_0 = escaneiaDiretorio(RAIZ);
$pastas = $nivel_0[0];
$arquivos = $nivel_0[1];

echo 'Navegue na árvore abaixo para vizualizar seus arquivos de log (registro de atividades dos funcionários), separados por data. <br /><br />';

?>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jstree basic demos</title>
<style>
html { margin:0; padding:0; font-size:62.5%; }
body { max-width:800px; min-width:300px; margin:0 auto; padding:20px 10px; font-size:14px; font-size:1.4em; }
h1 { font-size:1.8em; }
.demo { overflow:auto; border:1px solid silver; min-height:100px; }
</style>
<link rel="stylesheet" href="./../../dist/themes/default/style.min.css" />
</head>
<body>
<h1>HTML demo</h1>
<div id="html" class="demo">
<ul id="browser" class="filetree">
<li class="closed">
<span class="file">Lista de Arquivos</span>
<ul>
<?php 
foreach($arquivos as $arquivo){
?>
<li data-jstree='{ "icon" : "jstree-file" }'>
<span>
<?php echo $arquivo; ?>
</span>
</li>
<?php
}
?>
<?php
foreach($pastas as $pasta){ 
?>
<li class="closed">
<span class="folder"><?php echo $pasta; ?></span>
<ul>
<?php 
$nivel_1 = escaneiaDiretorio(GERAIS.$pasta.DS);
$sub_arquivos = $nivel_1[1];
foreach($sub_arquivos as $arq){
?>
<li data-jstree='{ "icon" : "jstree-file" }'>
<span>
<?php echo $arq; ?>
</span>
</li>
<?php
}
?>
<?php 
$nivel_1 = escaneiaDiretorio(GERAIS.$pasta.DS);
$sub_arquivos = $nivel_1[0];
foreach($sub_arquivos as $arq){
?>
<li>
<span>
<?php echo $arq; ?>
</span>
<ul>
<?php 
$nivel_2 = escaneiaDiretorio(GERAIS.$pasta.DS.$arq);
$teste = $nivel_2[0];
foreach($teste as $niv_2){
?>
<li>
<span><?php echo $niv_2; ?></span>
<ul>
<?php 
$nivel_3 = escaneiaDiretorio(GERAIS.$pasta.DS.$arq.DS.$niv_2);
$n3 = $nivel_3[0];
foreach($n3 as $niv_3){
?>
<li>
<span><?php echo $niv_3; ?></span>
<ul>
<?php 
$nivel_4 = escaneiaDiretorio(GERAIS.$pasta.DS.$arq.DS.$niv_2.DS.$niv_3);
$n4 = $nivel_4[0];
foreach($n4 as $niv_4){
?>
<li>
<span><?php echo $niv_4; ?></span>
<ul>
<?php 
$nivel_5 = escaneiaDiretorio(GERAIS.$pasta.DS.$arq.DS.$niv_2.DS.$niv_3.DS.$niv_4);
$n5 = $nivel_5[0];
foreach($n5 as $niv_5){
?>
<li>
<span><?php echo $niv_5; ?></span>
</li>
<?php }?>
</ul>
</li>
<?php }?>
</ul>
</li>
<?php }?>
</ul>
</li>
<?php }?>
</ul>
</li>
<?php
}
?>
</ul>
</li>
<?php
}
?>
</ul>
</li>
</ul>
</div>
<script src="./../../dist/jstree.min.js"></script>
<script>
// html demo
$('#html').jstree();
</script>
</body>
</html>


ismavolk

unread,
Jul 14, 2015, 11:23:44 AM7/14/15
to lista...@googlegroups.com
Olá.

Utilize uma função recursiva para fazer isto.
Chame sua função 'escaneiaDiretorio' dentro dela mesma, assim não é necessária a utilização de nenhum
foreach, a cada chamada vc passa o diretorio que precisa escanear.

Vai fazendo uns testes com função recursiva e analisando o retorno dela que logo vai achar a resolução do problema.

 

Luis Techio

unread,
Sep 19, 2015, 5:32:54 PM9/19/15
to PHPBR

Olá! Não tinha visto a sua resposta...Muito obrigado!

Tirei um tempo pra me concentrar e acabei tendo a ideia da recursiva... Deu muito certo! Muito obrigado.


Reply all
Reply to author
Forward
0 new messages