Ir para conteúdo
Fórum Script Brasil
  • 0

Dúvidas ao listar arquivos de diretório


Stanley -

Pergunta

Olá pessoal da Script Brasil,

Venho trabalhando com PHP embora não conheça muito do mesmo. Bom, pretendo realmente me dedicar (visto que está cada vez mais difícil sanar meus problemas com o pouco conhecimento adquirido). No entanto, não tenho tempo e preciso entregar um pequeno projeto ainda essa semana. Logo, venho recorrer a vocês para uma ajuda simples:

Tenho o seguinte código PHP:

<?php

        $pastas = "";
        $arquivos = "";

        // pega o endereço do diretório

        $diretorio = "./admin/fotos/"; 

        // abre o diretório

        $ponteiro  = opendir($diretorio);

        // monta os vetores com os itens encontrados na pasta

        while ($nome_itens = readdir($ponteiro)) {

            $itens[] = $nome_itens;

        // ordena o vetor de itens

        sort($itens);

        // percorre o vetor para fazer a separacao entre arquivos e pastas 

        foreach ($itens as $listar) {

            // retira "./" e "../" para que retorne apenas pastas e arquivos

              if ($listar!="." && $listar!=".."){ 



            // checa se o tipo de arquivo encontrado é uma pasta

               if (is_dir($listar)) { 

            // caso VERDADEIRO adiciona o item à variável de pastas

                $pastas[]=$listar; 

            } else{ 

            // caso FALSO adiciona o item à variável de arquivos

                $arquivos[]=$listar;

            }

               }

        }

        }

        // lista os arquivos se houverem

        if ($arquivos != "") {

            foreach($arquivos as $listar){

                  print "<div class=\"image_wrapper image_fl\"><a href=\"./admin/fotos/$listar\" class=\"highslide\" onclick=\"return hs.expand(this)\"><img src=\"./admin/fotos/miniaturas/min-$listar\" /></a></div>";

        }

           }

    ?>

Bom, como podem ver, a função do código é listar todos os arquivos presentes em um diretório (mais especificamente, fotos) e inserí-las na página usando o pequeno código em html (usando a função print). No entanto, com esse código tenho dois problemas:

1) A cada iteração (ou seja, uso da função print), o mesmo insere duas vezes o mesmo código (a mesma imagem), como se o conteúdo da variável $arquivos fosse sempre passado a $listar duas vezes.

2) Ao fim das inserções, o código insere mais um campo "vazio", ou seja, insere o código em Html, mas sem foto. Como se houvesse uma espécie de arquivo "oculto" no diretório e o código estivesse postando-o.

Segue em anexo uma screenshot mais detalhada:

http://imageshack.us/photo/my-images/171/fdsah.jpg/

Os números presentes na imagem informam a qual questão (dúvida) a marca vermelha representa.

Desde já agradeço,

Um grande abraço,

Stanley Sathler.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Um exemplo (http://codepad.viper-7.com/si3wmZ):

<?php
$directoryIterator = new DirectoryIterator('.');
foreach ($directoryIterator as $file) {
    // Não é . ou .. e é um arquivo? Então faça o que está dentro do corpo do if, caso contrário não faça nada ..
    if (! $file->isDot() && $file->isFile()) {
        // Faça tudo o que você quiser aqui, neste loop ...
        echo '<pre>' . $file->getPathName() . '</pre>';
    }
}

Não esqueça de ler o manual de DirectoryIterator e SplFileInfo.

Se tiver dúvidas poste novamente.

Um abraço.

Editado por Willian Gustavo Veiga
Link para o comentário
Compartilhar em outros sites

  • 0

Dá pra dar uma simplificada nisso aí...

function detectalogs($diretorio){
    $ptr = opendir($diretorio);
    while($nome_itens = readdir($ptr))
        if(($nome_itens[0] != '.') && (!is_dir($nome_itens)))
                $arquivos[] = $nome_itens;
    return($arquivos);
}
Funçãozinha básica que recebe o diretório, itera ele, a cada ítem lido, confere se o primeiro caractere é um ponto (já exclui a possibilidade de './' e '../' entrarem, e é pouco provavel que você terá algum arquivo cujo primeiro caractere seja um ponto), e confere se é um diretório. Se você vai querer os diretórios, deve armazenar em um outro vetor, mas caso não queira, não é necessário. Vai colocando no vetor $arquivos até acabar, e retorna o array. Para exibir os arquivos...
$retorno = detectalogs("nomedodiretorio/"); //Coloque o nome do diretorio
if(is_array($retorno)){
    foreach($retorno as $listar){
        echo "<div class=\"image_wrapper image_fl\"><a href=\"./admin/fotos/".$listar."\" class=\"highslide\" onclick=\"return hs.expand(this)\"><img src=\"./admin/fotos/miniaturas/min-".$listar."\" /></a></div>";
        }
} else {
    echo "Não há arquivos";
}
Note o uso de 'is_array'. Você não pode usar
if ($arquivos != "")

Para conferir se uma variável possui algo. Nesta situação, a melhor maneira é verificar se a variável é um array.

Link para o comentário
Compartilhar em outros sites

  • 0

Amigos, muito obrigado pela ajuda, de verdade.

Com o código do William, acabei não conseguindo. Chega a "listar", mas acontece o mesmo da questão 2: aparece a <div> (as bordas brancas), mas não aparece foto nenhuma, como se houvesse algo oculto.

Já com o código do mJi, consegui resolver a primeira questão. Agora sim está listando somente uma vez, sem duplo-post. No entanto, a questão 2 também permanece: como se houvesse algo oculto.

Mesmo assim eu agradeço de coração ambos os posts. Obrigado pela atenção e pela ajuda. Irei dar mais uma fuçada no código em busca da resolução da segunda questão. Qualquer dúvida, volto a postar por aqui.

Um forte abraço,

Stanley Sathler.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom William, o meu novo código (com a primeira questão resolvida) foi o que nosso amigo mJi postou logo acima.

<?php
function detectalogs($diretorio){
    $ptr = opendir($diretorio);
    while($nome_itens = readdir($ptr))
        if(($nome_itens[0] != '.') && (!is_dir($nome_itens)))
                $arquivos[] = $nome_itens;
    return($arquivos);
}

$retorno = detectalogs("admin/fotos/"); //Coloque o nome do diretorio
if(is_array($retorno)){
    foreach($retorno as $listar){
        echo "<div class=\"image_wrapper image_fl\"><a href=\"./admin/fotos/".$listar."\" class=\"highslide\" onclick=\"return hs.expand(this)\"><img src=\"./admin/fotos/miniaturas/min-".$listar."\" /></a></div>";
        }
} else {
    echo "Não há arquivos";
}

?>
O problema é: o código lista corretamente todos os arquivos presentes no diretório. Porém no final, preenche um conteúdo "vazio". Posso ver que, nesse conteúdo vazio, o echo foi executado, porque consigo ver as bordas da minha div. Mas nada de foto. Ou seja, é como se ele listasse um arquivo do diretório que não é uma foto. E como não consigo ver esse tal arquivo... é como se fosse "invisível", talvez algo presente nos sistemas Windows. Segue uma screenshot: http://imageshack.us/f/171/fdsah.jpg/ Perceba a marca numerada por "2)". A div está ali, mas nada de foto dentro dela como ocorreu nas demais. (Obs: essa screenshot é a mesma postada na primeira postagem. Por isso nela ainda consta o problema da questão 1), onde haviam dupla postagem em cada foto. Mas este já fora resolvido) Um forte abraço, Stanley Sathler. ------------------------------------------------------------ EDIÇÃO --------------------------------------------------------- Pessoal, consegui resolver o problema. Bastou adicionar a seguinte condição logo após o foreach()
if($listar != "miniaturas")
Isso porque mesmo a função "detectalogs()" ignorando os arquivos que começam com ./, o código continuava listando o diretório miniaturas. O código final fica assim:
<?php

    function detectalogs($diretorio){
       $ptr = opendir($diretorio);
        while($nome_itens = readdir($ptr))
        if(($nome_itens[0] != '.') && (!is_dir($nome_itens)))
                $arquivos[] = $nome_itens;
        return($arquivos);

    }

    $retorno = detectalogs("admin/fotos/"); //Coloque o nome do diretorio

    if(is_array($retorno)){
        foreach($retorno as $listar){

        if($listar != "miniaturas"){

             echo "<div class=\"image_wrapper image_fl\"><a href=\"./admin/fotos/".$listar."\" class=\"highslide\" onclick=\"return hs.expand(this)\"><img src=\"./admin/fotos/miniaturas/min-".$listar."\" /></a></div>";
        }
        }
    }
    ?>

Agradeço muito a colaboração de vocês, rapazes. De verdade. :-)

Um forte abraço,

Stanley Sathler.

Editado por Stanley -
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...