Filtrar extensoes de arquivos com File e FilenameUtils(função: wildcardMatchOnSystem)-JAVA

10 respostas Resolvido
java
J

Estou fazendo um programa de busca de diretórios e filtro de arquivos por suas extensões. Preciso usar a classe File para buscar o diretório (isso consegui fazer), porém, agora preciso que ele faça uma varredura nos diretórios em busca dos arquivos com a exntensão que o usuario informar. Se tiver certo, então ele me traz a lista de arquivos. Para filtrar/buscar a extensão nos arquivos usei FilenameUtils e sua função wildcardMatchOnSystem, e condições de Verdadeiro e/ou falso. Porém traz esse erro quando digito a extensão que quero buscar:

Diretório que será analisado:

/home/juliana

Extensoes de arquivos:pdf

java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.next(Scanner.java:1418)
	at controle.BuscaRecursiva2.pesquisaDiretorios(BuscaRecursiva2.java:25)
	at controle.BuscaRecursiva2.main(BuscaRecursiva2.java:124)
package controle;
import java.io.*;
import java.util.Locale;
import java.util.Scanner;
import org.apache.commons.io.FilenameUtils;
//import java.util.InputMismatchException;

public class BuscaRecursiva2 {
	private int nivel = 0;
	
	void pesquisaDiretorios() {
		try {
			@SuppressWarnings("resource")
			Scanner teclado=new Scanner(System.in);
			teclado.useLocale(Locale.US);
			//variaveis com caminhos a serem pesquisados
			System.out.println("Diretório que será analisado: " );
			String caminhoDiretorio=teclado.nextLine();
			
			System.out.print("\n Extensoes de arquivos:");
			String mascara=teclado.next("%d%d"+"*txt;*pdf;*txt;*doc;*xls;*java;*mp4;*jpg;*rar;*sh");
			String mascaras[]= mascara.split(";");
			
			System.out.println("\n Extensoes nao desejadas:");
			String negoMascara=teclado.next("%d%d"+"txt*; pdf*; mp3*; doc*; xls*; java*; mp4*; jpg*; rar*; sh*");
			String nego[]= negoMascara.split(";");
			
			System.out.println("Limite do nivel de busca: " );
			nivel = teclado.nextInt();
			
			File diretorio = new File(caminhoDiretorio);
			
			//verifica a existencia do diretorio
			if(!diretorio.exists()) {
				throw new Exception("Não existe!");
			}
			
			pesquisaMascara(diretorio.getPath(), mascaras,nego);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void pesquisaMascara(String diretorio, String[] mascaras, String [] nego) throws Exception {
		if(nivel >= 0) {
			File fDir = new File(diretorio);
			
			if (fDir.isDirectory()) {
				File[] listaFiles = fDir.listFiles();
				
				for (File file : listaFiles ) {
					String[] extensao = file.list();
					Boolean showMascaras = false;
					
					while(showMascaras != null) {
						for (int i = 0; i > mascaras.length; i++) {
							String masc = mascaras[i];
							
							if((extensao=masc(mascaras[i])) != null){
								Boolean showNego=false;
								
								for(int l=0;l<nego.length;l++) {
									if((extensao=negos(nego[l]))!=null) {
										showNego = true;
										break;
									}
								}
								
								if(showNego=false) {
									showMascaras=true;
									break;
								}
							}
						}
					}
					
					System.out.println("[ANALISANDO] " + file);
					
					if (file.isDirectory()) {
						if(nivel > 0) {
							nivel--;
							// se e diretorio, entra no diretorio
							pesquisaMascara(file.getPath(), mascaras,nego);
						} else {
							continue;
						}
					} else {
						if (FilenameUtils.wildcardMatchOnSystem(file.getName(), mascaras, nego)) {
							System.out.println("Encontrei o arquivo:" + file.getAbsolutePath());
						}
					}
				}
			}
		}
	}	     
	
	public String[] negos(String nego) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public String[] masc(String mascaras) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public static void main(String[] args) {
		new BuscaRecursiva2().pesquisaDiretorios();
	}
}

O que estaria errado ou mal estruturado no meu código??? POR FAVOR AJUDEM-ME! Tem semana que não encontro a resaposta…
OBRIGADA, DESDE JÁ!

10 Respostas

L
Solucao aceita

Veja um exemplo de como fazer a busca recursivamente:

package test.main;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Main {
	
	public static void main(String[] args) {
		File root = new File("C:/diretorioQualquer");
		List<File> files = search(root, "png", "rar");
		
		for(File f : files) {
			System.out.println(f.getName());
		}
	}
	
	private static List<File> search(File root, String ... extensions) {
		List<File> resultado = new ArrayList<>();
		
		for(File f : root.listFiles()) {
			if(f.isDirectory()) {
				resultado.addAll(search(f, extensions));
			} else {
				if(chechExtension(f, extensions)) { // verifica a extensão do arquivo
					resultado.add(f);
				}
			}
		}
		
		return resultado;
	}
	
	private static boolean chechExtension(File file, String ... extensions) {
		for(String extension : extensions) {
			if(file.getName().endsWith(extension)) {
				return true;
			}
		}
		
		return false;
	}
}
J

Certo… Mas não seria possivel receber as possiveis extensões com a função split separando cada uma.

L

Você precisa filtrar por mais de uma extensão é? Editei o exemplo que fiz.

J

é isso mesmo.

L

O exemplo que fiz ajudou?

J

Mas o que quer dizer String ... extensions esses 3 pontos dão a entender que é para completar com as possiveis extenções ou java entende que pode ser qualquer coisas recebida?

J

Mais ou menos… vou testar aqui, adaptando algumas coisas no meu código… Se eu conseguir respondo… Obrigada pela dica até aqui.

L

A parte String ... extensions chama-se varargs. É um recurso do java para enviar vários argumentos de uma vez, ou seja, um array. Nesse caso, trata-se de um array de Strings. Isso facilita pois permite que eu envie quantas extensões quiser sem precisar ficar declarando no método (String ext1, String ext2, String ext3, etc.). Entendeu?

J

AAh claro! Bemm prático mesmo… Vou tentar usar. Mas diante desse seu código haveira maneira deu optar por uma extensão sem fazer a pesquisa por todos da lista?
Como se fosse, uma case. Tipo ele recebe todas essas extensões que posso querer pesquisar mas na hora da pesquisa optar só por um tipo…

L

Então, no exemplo, a pesquisa é feita quando o método search é invocado:

search(root, "png", "rar");

Nesse momento, você escolhe quais extensões serão pesquisadas, ex:

search(root, "png"); // retorna apenas PNG
search(root, "png", "rar"); // retorna PNG e RAR

E se você quiser manter uma lista de extensões e usar apenas a que quiser, pode também:

String[] extensions = new String[] {"png", "rar"};
search(root, extensions[0]); // PNG
search(root, extensions[1]); // RAR
Criado 12 de maio de 2017
Ultima resposta 13 de mai. de 2017
Respostas 10
Participantes 2