Ir para conteúdo

POWERED BY:

Arquivado

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

Joaopedro23434we

Erro no código e não consigo resolver!

Recommended Posts

Olá galerinha, blz? eu gosto muito de programação mas nem sempre fico praticando até porque estudo (3° ano) e não tenho muito tempo e quando tenho estou cansado então sempre fico meio "enferrujado" na hora de desenvolver um sistema mais complicado. O problema é o seguinte, estou criando um sistema para ler toda as pastas do sistema, eu sei que existe uma função que faz isso automaticamente mas eu prefiro criar a minha própria, olhem ela aí:

<?php
ini_set("default_charset", "utf-8");

$links = array();
$navegacao = array();
$local = "C:/wamp/www/";
$loops = 0;
$finalizar = false;

while($finalizar!=true){
    $ad = opendir($local);
    $contarIndDir = count(scandir($local));
    $enc = 0;
    $execucoes = 1;
  
    while(false!=$lerDire=readdir($ad)){
        if(!stristr($lerDire, ".")){
            $links[$loops][$enc] = $local.$lerDire."/";
            $navegacao[$loops] = "0/".$enc;
            $enc++;
        }
        if($execucoes==$contarIndDir){
            if($enc>0){
                $local = $links[$loops][0];
            }else{
                if($loops==0){
                    echo "Não foram encontrados diretórios";
                }else{
                    $localMae = null;
                    do{
                      $quebLocal = explode("/", $local);
                      $definirQext = count($quebLocal)-2;
                      for($i=0;$i<$definirQext;$i++){
                          @$localMae .= $quebLocal[$i]."/";
                      }
                      $contarMatriz = count($links)-1;
                      $novoLoop = 0;
                      $op = 0;
                      $naveI0 = -1;
                      $naveI1 = -1;
                      $finalizarPI = false;
                      $tolerancia1 = 0;
                      $tolerancia2 = 0;
                      $liberar = false;
                      while($finalizarPI==false){
                          if($novoLinks=$links[$novoLoop][$op]==true){
                              if($novoLinks==$localMae){
                                  $naveI0 = $novoLoop;
                                  $naveI1 = $op;
                                  $finalizarPI = true;
                              }
                          }else{
                              if($tolerancia2<50){
                                  $tolerancia2++;
                                  $liberar = false;
                              }else{
                                  if($tolerancia1<50){
                                      $tolerancia2 = 0;
                                      $tolerancia++;
                                      $liberar = true;
                                  }else{
                                      $finalizarPI = true;
                                      echo "Atingido o limite de tolerância.";
                                      exit(0);
                                  }
                              }
                          }
                          $op++;
                          if($liberar==true){
                              $op = 0;
                              $novoLoop++;
                          }
                      }
                      #Área com problemas
                      if($finalizarPI==true){
                          $extNavega = explode("/", $navegacao[$naveI0]);
                          if($extNavega[0]<$extNavega[1]){
                              $lidos = $extNavega[0]+1;
                              $navegacao[$naveI0] = $lidos."/".$extNavega[1];
                              $local = $links[$naveI0][$lidos];
                              $continua = false;
                          }else{
                              $continua = true;
                          }
                      }
                    }while($continua!=false);
                    /////////////////////////////////////////////////////////
                }
            }
        }
        $execucoes++;
    }
    $loops++;
    $vN = explode("/" , $navegacao[0]);
    if($vN[0]>$vN[1]){
        echo "<br />".$vN[0].":".$vN[1];
        $finalizar = true;
    }
    
    var_dump($links);
}
closedir($ad);
?>

Esse "ÁREA COM PROBLEMAS" é onde aparentemente está dando erro. Essa parte do código é responsável por fazer com que o sistema volte na pasta anterior pois chegou ao fim de uma pasta e agora vai ler outra. Já faz 1 mês que monto esses códigos (Claro que não é todo dia, apenas nos sábados ou domingos), sempre faço e refaço, mas sempre tem um erro. Esse resolvi manter, podem me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As funções nativas de file system existem por algumas razões:

- São mais rápidas;

- Normalizam o uso entre diferentes sistemas operacionais.

Entretanto, não é "apenas isso". Veja, você está usando explode para tratar o file path, sendo que existem tantas outras funções para isso.

Antes de eu falar que não faz sentido algum continuar seu código. Qual é o erro que ocorre?

Compartilhar este post


Link para o post
Compartilhar em outros sites

As funções nativas de file system existem por algumas razões:

- São mais rápidas;

- Normalizam o uso entre diferentes sistemas operacionais.

Entretanto, não é "apenas isso". Veja, você está usando explode para tratar o file path, sendo que existem tantas outras funções para isso.

Antes de eu falar que não faz sentido algum continuar seu código. Qual é o erro que ocorre?

Estou montando ele justamente para treinar a lógica, para ver se tenho capacidade para montar algo do tipo(Pelo visto não rsrs). O erro é que ele não está lendo a pasta anterior pois o sistema funciona assim: Ele irá indexar todas as pastas encontradas que estão dentro de outra pasta e irá ler sempre a primeira delas, porém, se não existir nenhuma pasta dentro de outra ele deveria retornar a anterior e ler a segunda, retornar quando acabar, ler as que ainda existam e quando ler todas deveria ler a terceira, sei que é meio confuso mas é isso aí. No final ele deveria aprensentar todas as pastas encontradas quando dou o var_dump que no caso funciona em partes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que uma pequena inversão de lógica com um "elemento" de programação a mais poderia lhe indicar um caminho mais assertivo.

Eu, particularmente, construiria um leitor recursivo de diretórios utilizando recursividade (já que é um leitor recursivo...).

Estude sobre recursividade, nela pode estar a "chave" de não conseguir "retroceder e avançar". uma vez que na recursividade você não precisará retroceder, apenas avançar e retornar quanto não houver mais registros.

Outro estudo importante, é como funcionam estruturas de dados em árvore. É importante conhecer e entender.

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.