Listar Ficheiros e Pastas Recursivamente

3 respostas
E

Boas. Tou com uma duvida e gostava que alguem me ajudasse ou desse alguma dica.
Tenho o seguinte codigo que me lista os ficheiros de 1 directorio.

public void ListarFicheiros() throws IOException{

//BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

String login=in.readLine();

System.out.println("login recebido no Listar Ficheiros: "+login);
List<File> arquivos = new ArrayList<File>(); 
	File dir=new File(login);
	if (dir.isDirectory()) {  
		File[] sub = dir.listFiles();  
		for (File f : sub) {  
			if (f.isDirectory()) {  
				System.out.println (f);  

			} else {  
				arquivos.add (f);  

			}
		}
	}
	ObjectOutputStream obj = new ObjectOutputStream (s.getOutputStream());
	obj.writeObject(arquivos); 
	obj.flush();
}

O codigo recebe do socket um utilizador e vai listar todos os ficheiros da pasta principal do utilizador. Isto funciona 100%. A minha duvida é: quando tenho sub-directorios também gostaria que me lista-se os ficheiros, para tal precizo de uma função recursiva. Alguem me ajuda?
Obrigado

3 Respostas

davidbuzatto

1 - Converta esse seu código em um método que receba o caminho do arquivo.
2 - Faça um if, verificando se o arquivo obtido é um diretório ( if ( file.isDirectory() ) )
3 - Caso seja um diretório, chame o método novamente, com o novo caminho ( caminhoAntigo+nomeDoArquivo).

Até mais!

E

davidbuzatto:
1 - Converta esse seu código em um método que receba o caminho do arquivo.
2 - Faça um if, verificando se o arquivo obtido é um diretório ( if ( file.isDirectory() ) )
3 - Caso seja um diretório, chame o método novamente, com o novo caminho ( caminhoAntigo+nomeDoArquivo).

Até mais!

Viva. Tenho que alterar este metodo? Pois o directorio que recebe é o login atraves de socket

String login=in.readLine();

System.out.println("login recebido no Listar Ficheiros: "+login);
List<File> arquivos = new ArrayList<File>(); 
	File dir=new File(login);
depois quando é directorio:

if (f.isDirectory()) {

//ListarFicheiros(f);

System.out.println (f);
} else {  
				arquivos.add (f);

Queria que listas-se esse directorio e me devolves-se aqui nesta função, porque ele vai adicionar os ficheiros à lista de arquivos e devolver por socket ao cliente e retornar a uma interface da aplicação o resultado apresentando numa listbox.
Não tou a entender bem como vou conseguir implementar as suas dicas.
Não há forma de fazer uma função que continuasse a listar, mas para isso seria necessario enviar os ficheiros? e depois teria de guardar noutro ficheiro e adicionar aos arquivos?

T

Postei isto faz algum tempo, adapte para seu uso.

import java.util.*;
import java.io.*;

/**
* Faz algo parecido com "dir /s *.html" (no caso Windows) ou
* find . -name '*.html' -print (no caso Unix). 
* Cuidado: se houver um arquivo "XXX.HTML" (em maiúsculas) não vai
* reconhecer, a menos que você explicite na expressão regular.
*/
class ExemploDir {
    /**
            * @param startingDirectory O diretório inicial.
            * @param pattern Uma expressão regular que deve ser aplicada
            * ao nome do arquivo.
            */
    public List<File> findFiles (final File startingDirectory, final String pattern) {
        List<File> files = new ArrayList<File>();
        if (startingDirectory.isDirectory()) {
            File[] sub = startingDirectory.listFiles(new FileFilter() {
                public boolean accept (File pathname) {
                    return pathname.isDirectory() || pathname.getName().matches (pattern);
                }
            });
            for (File fileDir: sub) {
                if (fileDir.isDirectory()) {
                    files.addAll (findFiles (fileDir, pattern));
                } else {
                    files.add (fileDir); // 
                }
            }
        }
        return files;
    }
    /**
    * 
    */
    public static void main(String[] args) {
        ExemploDir ed = new ExemploDir();
        // Listando todos os arquivos "*.html"
        System.out.println (ed.findFiles (new File("."), ".*\.html"));
        // Listando todos os arquivos "*.java" ou "abs*.txt"
        System.out.println (ed.findFiles (new File("."), "(.*\.java|abs.*\.txt)"));
        // Listando todos os arquivos "*.htm*" (incluindo arquivos *.HTM) - útil para Windows
        System.out.println (ed.findFiles (new File("."), "(?i).*\.htm[^.]*"));
        // Listando todos os arquivos "*.htm*" e "*.jsp" 
        // (incluindo arquivos *.HTM e *.JSP) no diretório C:\INETPUB - útil para Windows
        System.out.println (ed.findFiles (new File("C:/INETPUB"), "(?i)(.*\.htm[^.]*|.*\.jsp)"));
    }
}
Criado 7 de janeiro de 2008
Ultima resposta 7 de jan. de 2008
Respostas 3
Participantes 3