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?
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.
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 );
}
}
}
É … 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…
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.
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.