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

Definindo Variáveis De Diretórios E Subdiretórios


Illidan

Pergunta

Galera, é o seguinte... Já tentei elaborar um script, mas estou empacado no meio. Eu precisava criar uma forma de definir umas variáveis automaticamente. Começa com isto:

$diretorio[0] = "home"; // diretório raiz

Aí o script abre esse diretório, lê seu conteúdo e vai nomeando os "arquivos" que são diretórios dessa pasta como:

$diretorio[1] = "home/imagens";

$diretorio[2] = "home/contatos";

$diretorio[3] = "home/cifras";

...

...

Entenderam? Aí, ele pega cada diretório desses, e varre por mais subdiretórios:

$diretorio[4] = "home/imagens/fotos";

$diretorio[5] = "home/cifras/paralamas";

$diretorio[6] = "home/cifras/legiao";

...

...

Basicamente, eu queria criar um script que você informando uma pasta "raiz", ele varreria o conteúdo dessa pasta definindo cada subdiretório num array, e assim por diante, até acabarem todos os subdiretórios.

É possível? Alguém já fez algo assim antes?

Por favor, me ajudem! blink.gif

Muito obrigado!

PS: Este é o código que criei até o momento. Ele define as variáveis da raiz:

$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {

    $x = "0";

    while (($file = readdir($dh)) !== false) {

        if (is_dir($file) && ($file != ".") && ($file != "..")) {

            $x++;

            $diretorio[$x] = $file;

        }

    }

    closedir($dh);

}

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Isso, mais ou menos como o comando dir... mas ele vai pegar apenas diretórios e subdiretórios e colocar o caminho de cada um dentro de um array.

Eu estou quase elaborando um script de busca muito legal, cara. você precisa ver... vai ajudar bastante a galera, pois muita gente vem aqui pedindo esse tipo de coisa... se der certo de fazer isso que eu estou querendo, vai ser só informar no script o caminho da "raiz" da página que ele fará uma busca por todos os documentos, automaticamente... sem banco de dados, nem nada... tá muito legal biggrin.gif Mas pra isso eu preciso resolver esse problema...

Bom, vou continuar tentando aqui... um grande abraço!

Link para o comentário
Compartilhar em outros sites

  • 0
Isso, mais ou menos como o comando dir... mas ele vai pegar apenas diretórios e subdiretórios e colocar o caminho de cada um dentro de um array.

Eu estou quase elaborando um script de busca muito legal, cara. você precisa ver... vai ajudar bastante a galera, pois muita gente vem aqui pedindo esse tipo de coisa... se der certo de fazer isso que eu estou querendo, vai ser só informar no script o caminho da "raiz" da página que ele fará uma busca por todos os documentos, automaticamente... sem banco de dados, nem nada... tá muito legal biggrin.gif Mas pra isso eu preciso resolver esse problema...

Bom, vou continuar tentando aqui... um grande abraço!

c quiser passar o código pra eu poder ajudar em algo...

essa semana to sem faze nada mesmo... :-) hehehe

qualquer coisa manda no email

edubort@horizon.com.br

falou ae

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu, cara... agradeço mesmo!

Eu sinto que estou perto de conseguir alguma coisa. Olha só o meu raciocínio:

1. A cada novo diretório que encontra, ele cria um índice novo no array, certo?

2. Aí pensei: vou colocar um laço "for" pra varrer cada elemento do array, fazendo com que ele continue enquanto a variável $diretorio[$i] não for nula, entendeu? (o índice $i é o último elemento do array, e ele vai mudando constantemente, conforme encontra novos diretórios)

Pra você entender melhor, vou colocar em vermelho isso que acabei de dizer

O código está assim:

$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {

    $x = "0";

    while (($file = readdir($dh)) !== false) {

        if (is_dir($file) && ($file != ".") && ($file != "..")) {

            $x++;

            $diretorio[$x] = $file;

            echo $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

        }

    }

    closedir($dh);

}

for ($y = "1"; isset($diretorio[$y]); $y++) {

    if ($dh = opendir("$diretorio[$y]")) {

        while (($file = readdir($dh)) !== false) {

           if (is_dir($file) && ($file != ".") && ($file != "..")) {

                $x++;

                $diretorio[$x] = $diretorio[0] . "/" . $diretorio[$y] . "/" . $file;

                echo  $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

            }

        }

        closedir($dh);

    }

}

O índice tá começando no "1" porque o "0" já é a raiz... era pra funcionar, você não acha? Não sei onde pode estar o problema... Esses "echos" que eu coloquei pelo meio são pra eu ver como o script está funcionando. Depois vou apagá-los...

Última coisa: viu o valor que eu coloquei em azul? Ele é o primeiro subdiretório varrido, que é o $diretorio[1]. Então... copia esse código e altere esse índice pra "0"... ele varre a raiz novamente! Mas quando ele vale 1, ele não varre nada! O pior é que a variável $diretorio[1] está definida certinha, e há subpastas dentro dela!

Sinceramente, não consegui entender porque isso tá acontecendo... sad.gif

Falou! Um abraço!

E obrigado pela ajuda! laugh.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Se cada um desses elementos for um diretório (ou subdiretório) e se não estiver faltando nenhum subdiretório nessa lista aí, SIM, é exatamente isso que eu estou querendo! biggrin.gif

É isso mesmo? Como você fez? biggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Illidan eu entendi perfeitamente sua lógica e realmente tem muita lógica no que você quer fazer, embora também não tenha entendido o porque que ele não está reconhecendo o 0 como a raiz...

Mas bem... não ficaria mais fácil elaborar um sistema de pesquisa via ftp? O que você acha... Vou te dar um exemplo...


<?php

// estabelece o conexão
$conn_id = ftp_connect($ftp_server);

// login com nome de usuário e senha
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// obtém o conteúdo do diretório atual
$contents = ftp_nlist($conn_id, "/");

// mostra $contents
var_dump($contents);
?> 

Pode ser que ele pegue todos os diretórios ligados á raiz... aí a gente pediria para guardar essa lista de arquivos e pastas e passaria para o próximo passo... Pediriaao ftp que avançasse um diretório usando ftp_cdup() e assim realizando a pesquisa...

enfim, até chegar ao topo da árvore, descendo, subindo ao topo... e assim indo... de forma q ele iria analisando todos os diretórios e retornando os seus respectivos nomes...

O que você acha?

Link para o comentário
Compartilhar em outros sites

  • 0

Eduardo,

Realmente, acredito que seja uma saída muito boa... mas, vamos lá...

1 - Ele está reconhecendo o índice "0" como a raiz. O que ele não reconhece são os outros índices, embora estejam setados corretamente (isso eu vi pelos testes que eu fiz).

2 - Nunca utilizei conexões por FTP no PHP, mas aparentemente não é muito complicado... bom, eu fiquei com uma dúvida: pelo o que eu entendi, essa função "ftp_cdup()" vai buscando uma subpasta após a outra, ficando cada vez mais "longe" da raiz, certo? Aí, quando não tiver mais subpastas, você disse pra retornar ao zero e começar a varrer outras subpastas. Mas, será que não ficaria muito complicado criar uma função pra que ele não pegue a mesma subpasta de anteriormente? Bom, não sei como funciona essa função, pode ser que não...

Eu identifiquei onde está o problema nesse último código que eu postei:

$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {

    $x = "0";

    while (($file = readdir($dh)) !== false) {

        if (is_dir($file) && ($file != ".") && ($file != "..")) {

            $x++;

            $diretorio[$x] = $file;

            echo $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

        }

    }

    closedir($dh);

}

for ($y = "1"; isset($diretorio[$y]); $y++) {

    if ($dh = opendir("$diretorio[$y]")) {

        while (($file = readdir($dh)) !== false) {

           if (is_dir($file) && ($file != ".") && ($file != "..")) {

                $x++;

                $diretorio[$x] = $diretorio[0] . "/" . $diretorio[$y] . "/" . $file;

                echo  $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

            }

        }

        closedir($dh);

    }

}

Se eu tiro esse "is_dir()", ele funciona perfeitamente. Mas não retorna só diretórios, entendeu? Queria saber porque isso tá acontecendo...

Muito obrigado pela sua ajuda até aqui!

Um abraço!

Link para o comentário
Compartilhar em outros sites

  • 0

Não sei, cara... bom, vou testar pra ver no que dá. Mas esses pontos são necessários que estejam ali pelo seguinte:

quando o PHP vai retornando os elementos de um diretório, ele sempre retorna esses dois: "." e ".." , o ponto representa o diretório atual, e os dois pontos representam um diretório anterior. E esses elementos são encarados como "diretórios".

Então, se eu tirar o != "." e o != ".." , e mandar retornar os diretórios, ele voltará esses dois, tb... entendeu?

Link para o comentário
Compartilhar em outros sites

  • 0

Eu to testando aki... quanto aos pontos, não tinha pensado nisso.. me desculpa.. hehehe

Que isso, imagina biggrin.gif

Acabei de ver essa função, ela é pra PHP 5... sad.gif

O código está exatamente como na última vez em que eu postei. Aquela função is_dir() de onde eu coloquei em vermelho está me traindo... hehehe! Tem diretório, mas ela não retorna nada!

Link para o comentário
Compartilhar em outros sites

  • 0

tah assim...

eu só dei um valor para o $x

e dps d faze as parada ali ele vai acrescentendo...

<?php
$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {
    $x = "0";
    while (($file = readdir($dh)) !== false) {
        if (is_dir($file) && ($file != ".") && ($file != "..")) {
            $x++;
            $diretorio[$x] = $file;
            echo $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final
        }
    }
    closedir($dh);
}

for ($y = "1"; isset($diretorio[$y]); $y++) {
    if ($dh = opendir("$diretorio[$y]")) {
        while (($file = readdir($dh)) !== false) {
           if (is_dir($file) && ($file != ".") && ($file != "..")) {
      	$x = 1;
    $diretorio[$x] = $diretorio[0] . "/" . $diretorio[$y] . "/" . $file;
                $x++;
                echo  $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final
            }
        }
        closedir($dh);
    }
}
?>

Link para o comentário
Compartilhar em outros sites

  • 0

Eduardo, isso é o que eu já estou fazendo biggrin.gif

Olha o código:

$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {

    $x = "0";

    while (($file = readdir($dh)) !== false) {

        if (is_dir($file) && ($file != ".") && ($file != "..")) {

            $x++;

            $diretorio[$x] = $file;

            echo $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

        }

    }

    closedir($dh);

}

for ($y = "1"; isset($diretorio[$y]); $y++) {

    if ($dh = opendir("$diretorio[$y]")) {

        while (($file = readdir($dh)) !== false) {

           if (is_dir($file) && ($file != ".") && ($file != "..")) {

                $x++;

                $diretorio[$x] = $diretorio[0] . "/" . $diretorio[$y] . "/" . $file;

                echo  $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final

            }

        }

        closedir($dh);

    }

}

viu?

Link para o comentário
Compartilhar em outros sites

  • 0

tah assim...

eu só dei um valor para o $x

e dps d faze as parada ali ele vai acrescentendo...

<?php
$diretorio[0] = ".";

if ($dh = opendir($diretorio[0])) {
    $x = "0";
    while (($file = readdir($dh)) !== false) {
        if (is_dir($file) && ($file != ".") && ($file != "..")) {
            $x++;
            $diretorio[$x] = $file;
            echo $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final
        }
    }
    closedir($dh);
}

for ($y = "1"; isset($diretorio[$y]); $y++) {
    if ($dh = opendir("$diretorio[$y]")) {
        while (($file = readdir($dh)) !== false) {
           if (is_dir($file) && ($file != ".") && ($file != "..")) {
      	$x = 1;
    $diretorio[$x] = $diretorio[0] . "/" . $diretorio[$y] . "/" . $file;
                $x++;
                echo  $diretorio[$x] . " - " . $x . "<br />";  //  tirar no final
            }
        }
        closedir($dh);
    }
}
?>

Blood, eu agradeço! Mas essa $x não pode ser 1... ela marca os índices do array, sacou? Se eu voltar ela pro valor 1, ela vai sobrepor algum índice já estabelecido...

Bom, muito obrigado pela ajuda! laugh.gif

Link para o comentário
Compartilhar em outros sites

  • 0

<?

foreach (glob("*.txt") as $filename) {

echo "Tamanho de $filename " . filesize($filename) . "\n";

}

?>

Eu tentei utilizá-la mandando retornar arquivos .htm, mas não trouxe nada... sad.gif

De qualquer forma, muito obrigado a vocês dois!

Bom, eu estava pensando aqui... será que não tem que utilizar aquela função clearstatcache() ???? Nunca utilizei ela, mas estou achando que é isso... tá muito estranho o is_dir() não retornar os diretórios!

Link para o comentário
Compartilhar em outros sites

  • 0

Toretto,

Se você não mudou o meu código, aconteceu o seguinte:

Esse número que eu mandei imprimir na frente de cada diretório é o índice do array, entendeu? Por exemplo, o diretório "Zanon" é a variável $diretorio[4];

beleza? Foi isso, mesmo?

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,3k
    • Posts
      652,5k
×
×
  • Criar Novo...