Estou tendo um problema com metodos recursivos, fiz um exemplo aqui:
importjava.io.File;publicclassTeste{publicstaticvoidmain(String[]args){getFilesRecursivo(newFile("/home/gustavo/TESTE"));}publicstaticvoidgetFilesRecursivo(Filediretorio){File[]file=diretorio.listFiles();if(file!=null){for(inti=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?
importjava.io.File;publicclassTeste{privatebooleanencontrado=false;publicstaticvoidmain(String[]args){Testeteste=newTeste();teste.getFilesRecursivo(newFile("/home/gustavo/TESTE"));}privatevoidgetFilesRecursivo(Filediretorio){File[]file=diretorio.listFiles();if(file!=null){for(inti=0;i<file.length;i++){if(encontrado)break;elseif(!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]);}}}}}
Mas assim tive que criar uma variavel a mais, se eu nao conseguir de outro jeito acho que vai ficar assim.
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.
importjava.io.*;importjava.util.*;publicclassTeste{publicstaticvoidmain(String[]args){Testeteste=newTeste();List<File>arquivos=teste.getFiles(newFile("/home/gustavo/TESTE"),"txt");if(arquivos.size()==0){System.out.println("Nenhum arquivo encontrado.");}else{for(Filef: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. */publicList<File>getFiles(Filediretorio,StringnomeArquivo){List<File>arquivos=newArrayList<File>();// a lista de arquivos passada é populada dentro do métodogetFilesRecursivo(diretorio,nomeArquivo,arquivos);returnarquivos;}/* * Método recursivo para a obtenção dos arquivos. */privatevoidgetFilesRecursivo(Filediretorio,StringnomeArquivo,List<File>lista){if(diretorio.listFiles()==null)return;for(Filef:diretorio.listFiles()){if(!f.isDirectory()){if(f.getName().equals(nomeArquivo)){lista.add(f);}}else{getFilesRecursivo(f,nomeArquivo,lista);}}}}
[]´s
rimarck
publicstaticvoidmain(String[]args){Teste.getFilesRecursivo(newFile("/home/gustavo/TESTE"),"txt");}publicstaticvoidgetFilesRecursivo(Filefile,StringnomeArquivo){if(file.isDirectory()){for(FilesubFile:file.listFiles()){getFilesRecursivo(subFile,nomeArquivo);}}elseif(file.getName().toLowerCase().indexOf(nomeArquivo)!=-1){System.out.println("O caminho do arquivo procurado e: "+file.getAbsoluteFile());}}
gqferreira
É … 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…
rimarck
Se você quiser so achar 1 arquivo:
publicstaticvoidmain(String[]args){Teste.getFilesRecursivo(newFile("/home/gustavo/TESTE"),"txt");}publicstaticbooleangetFilesRecursivo(Filefile,StringnomeArquivo){if(file.isDirectory()){for(FilesubFile:file.listFiles()){if(getFilesRecursivo(subFile,nomeArquivo)){returntrue;}}}elseif(file.getName().toLowerCase().indexOf(nomeArquivo)!=-1){System.out.println("O caminho do arquivo procurado e: "+file.getAbsoluteFile());returntrue;}returnfalse;}
denirroberto
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.
importjava.io.*;importjava.util.*;publicclassTeste{publicstaticvoidmain(String[]args){Testeteste=newTeste();List<File>arquivos=teste.getFiles(newFile("/home/gustavo/TESTE"),"txt");if(arquivos.size()==0){System.out.println("Nenhum arquivo encontrado.");}else{for(Filef: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. */publicList<File>getFiles(Filediretorio,StringnomeArquivo){List<File>arquivos=newArrayList<File>();// a lista de arquivos passada é populada dentro do métodogetFilesRecursivo(diretorio,nomeArquivo,arquivos);returnarquivos;}/* * Método recursivo para a obtenção dos arquivos. */privatevoidgetFilesRecursivo(Filediretorio,StringnomeArquivo,List<File>lista){if(diretorio.listFiles()==null)return;for(Filef:diretorio.listFiles()){if(!f.isDirectory()){if(f.getName().equals(nomeArquivo)){lista.add(f);}}else{getFilesRecursivo(f,nomeArquivo,lista);}}}}
[]´s
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
denirroberto
Bom já que ninguém pode me ajudar resolvi sozinho.