Recursividade de metodo

Olá pessoal!

Estou tendo um problema com metodos recursivos, fiz um exemplo aqui:

import java.io.File;

public class Teste {

	public static void main(String[] args) {
		getFilesRecursivo(new File("/home/gustavo/TESTE"));
	}
	public static void getFilesRecursivo(File diretorio)
	{
		File[] file = diretorio.listFiles();

		if (file!=null)	
		{
			for (int i = 0; i < file.length;i++)
			{
				if (!file[i].isDirectory())
				{
						if (file[i].getName().toLowerCase().equals("txt"))
						{
							System.out.println("O caminho do arquivo procurado e: "+file[i].getAbsoluteFile());
							break; //PRESTE ATENCAO NESSE BREAK
						}
				}
				else
				{
					getFilesRecursivo(file[i]);
				}
			}
		}
	}
}

A ideia era que ao encontrar o primeiro arquivo com o tal nome, o metodo fosse ‘decapitado’ . Pelo que eu sei, quando vc chama o proprio metodo de novo é como se vc tivesse outro igualzinho mas no mesmo codigo, ou seja o mesmo. A diferenca é que com o mesmo codigo ele gera varias instancias do metodo, o que ta acontecendo é que o break mata a instancia atual (nao se auto-chama mais), mas dai ele volta para a antiga e continua… como resolver isso?

:thumbup: :thumbup:

Solucionei dessa forma:

[code]import java.io.File;

public class Teste {

private boolean encontrado=false;
public static void main(String[] args) {
	Teste teste = new Teste();
	teste.getFilesRecursivo(new File("/home/gustavo/TESTE"));
}
private void getFilesRecursivo(File diretorio)
{
	File[] file = diretorio.listFiles();

	if (file!=null)	
	{
		for (int i = 0; i < file.length;i++)
		{
			if (encontrado)
				break;
			else if (!file[i].isDirectory())
			{
					if (file[i].getName().toLowerCase().equals("txt"))
					{
						System.out.println("O caminho do arquivo procurado e: "+file[i].getAbsoluteFile());
						encontrado=true;
					}
			}
			else
			{
				getFilesRecursivo(file[i]);
			}
		}
	}
}

}
[/code]
Mas assim tive que criar uma variavel a mais, se eu nao conseguir de outro jeito acho que vai ficar assim.

Oi Gustavo,

Dei uma melhorada no seu código. Na verdade vc não precisa parar a recursão, um arquivo com o mesmo nome pode existir em diversos subdiretórios.
Dá uma olhada.

[code]import java.io.;
import java.util.
;

public class Teste {

public static void main( String[] args ) {
    
    Teste teste = new Teste();
    List<File> arquivos = teste.getFiles( new File( "/home/gustavo/TESTE" ), "txt" );
    
    if ( arquivos.size() == 0 ) {
        System.out.println( "Nenhum arquivo encontrado." );
    } else {
        for ( File f : arquivos ) {
            System.out.println( "O caminho é: " + f.getAbsolutePath() );
        }
    }
    
}

/*
 * Obtéma lista de arquivos (pode haver mais de um arquivo com o mesmo nome em um subdiretório.
 */
public List<File> getFiles( File diretorio, String nomeArquivo ) {
    
    List<File> arquivos = new ArrayList<File>();
    
    // a lista de arquivos passada é populada dentro do método
    getFilesRecursivo( diretorio, nomeArquivo, arquivos );
    
    return arquivos;
    
}

/*
 * Método recursivo para a obtenção dos arquivos.
 */
private void getFilesRecursivo( File diretorio, String nomeArquivo, List<File> lista ) {
    
    if ( diretorio.listFiles() == null )   
        return;
        
    for ( File f : diretorio.listFiles() ) {
        
        if ( !f.isDirectory() ) {
            if ( f.getName().equals( nomeArquivo ) ) {
                lista.add( f );
            }
        } else {
            getFilesRecursivo( f, nomeArquivo, lista );
        }
        
    }
        
}

}[/code]
[]´s

    public static void main(String[] args) {
        Teste.getFilesRecursivo(new File("/home/gustavo/TESTE"), "txt");
    }

    public static void getFilesRecursivo(File file, String nomeArquivo) {
        if (file.isDirectory()) {
            for (File subFile : file.listFiles()) {
                getFilesRecursivo(subFile, nomeArquivo);
            }
        } else if (file.getName().toLowerCase().indexOf(nomeArquivo) != -1) {
            System.out.println("O caminho do arquivo procurado e: " + file.getAbsoluteFile());
        }
    }

É … eu fiz assim antes mas o ‘lance’ de ter um metodo que retorna um List contendo o nome de todos os arquivos encontrados pode dar problema, fiz um teste indicando o diretorio /home, e como vc sabe, existem muitos arquivos e o List ficou tao grande que deu “java heap space”… pau de memoria… entao fiz com que a medida que vou listando vou verificando e crio um list somente com os encontrados, assim nao tenho que armazenar um list gigante com todos os files encontrado no diretorio a ser pesquisado. Mas um criterio de pesquisa que desejo é parar a pesquisa assim que encontrar o primeiro. Sei que pode haver varios com o mesmo nome, mas por exemplo:

Sei que existe somente um arquivo GUSTAVO.txt em /home…, entao nao precisa continuar o massacre do processador tentando achar outro…

Se você quiser so achar 1 arquivo:

    public static void main(String[] args) {  
        Teste.getFilesRecursivo(new File("/home/gustavo/TESTE"), "txt");  
    }

    public static boolean getFilesRecursivo(File file, String nomeArquivo) {
        if (file.isDirectory()) {
            for (File subFile : file.listFiles()) {
                if (getFilesRecursivo(subFile, nomeArquivo)) {
                    return true;
                }
            }
        } else if (file.getName().toLowerCase().indexOf(nomeArquivo) != -1) {
            System.out.println("O caminho do arquivo procurado e: " + file.getAbsoluteFile());
            return true;
        }
        
        return false;
    }

[quote=davidbuzatto]Oi Gustavo,

Dei uma melhorada no seu código. Na verdade vc não precisa parar a recursão, um arquivo com o mesmo nome pode existir em diversos subdiretórios.
Dá uma olhada.

[code]import java.io.;
import java.util.
;

public class Teste {

public static void main( String[] args ) {
    
    Teste teste = new Teste();
    List<File> arquivos = teste.getFiles( new File( "/home/gustavo/TESTE" ), "txt" );
    
    if ( arquivos.size() == 0 ) {
        System.out.println( "Nenhum arquivo encontrado." );
    } else {
        for ( File f : arquivos ) {
            System.out.println( "O caminho é: " + f.getAbsolutePath() );
        }
    }
    
}

/*
 * Obtéma lista de arquivos (pode haver mais de um arquivo com o mesmo nome em um subdiretório.
 */
public List<File> getFiles( File diretorio, String nomeArquivo ) {
    
    List<File> arquivos = new ArrayList<File>();
    
    // a lista de arquivos passada é populada dentro do método
    getFilesRecursivo( diretorio, nomeArquivo, arquivos );
    
    return arquivos;
    
}

/*
 * Método recursivo para a obtenção dos arquivos.
 */
private void getFilesRecursivo( File diretorio, String nomeArquivo, List<File> lista ) {
    
    if ( diretorio.listFiles() == null )   
        return;
        
    for ( File f : diretorio.listFiles() ) {
        
        if ( !f.isDirectory() ) {
            if ( f.getName().equals( nomeArquivo ) ) {
                lista.add( f );
            }
        } else {
            getFilesRecursivo( f, nomeArquivo, lista );
        }
        
    }
        
}

}[/code]
[]´s[/quote]

Maravilha Gustavo excelente dica, mas estou com um problema, consigo apenas listar todos os arquivos a intenção é listar somente as pastas tem como? Tentei tirar o diferente de !f.isDirectory() mas nada feito, consigo diferenciar se é oculto ou não mas não consigo trazer os diretórios e subdiretorios. Ah, tem como criar edentação também, estou usando java web jee 6.

Obrigado

Bom já que ninguém pode me ajudar resolvi sozinho.