Contagem de arquivos

3 respostas
F

Tenho a seguinte classe que conta quantos arquivos javascript (.js) estão dentro de um diretório e seus respectivos subdiretórios, entretanto quando eu tenho uma pasta com o nome “js” está sendo contado também. Ex:

Na pasta “C:\temp\Scripts” há 5 arquivos .js, com a seguinte a estrutura:

C:\temp\Scripts
+++ js ==>> aqui estão meus 5 arquivos javascript

O resultado está saindo com 6, porque a pasta também está sendo contada. Alguém tem idéia do que poderia ser?

package br.com.file.dir;

import java.io.File;  
import java.io.FilenameFilter;  
import java.util.regex.Pattern;  


public class Teste {  
	public static void main(String[] args) {  
		new Teste();  
	}  

	public Teste() {  
		File f = new File("C:\\temp\\Scripts");  
		System.out.println(contarArquivos(f, "js"));  
	}  

	public int contarArquivos(File path, String extensao) {  
		int quantidade = 0;  

		if ( path == null ) throw new RuntimeException("Deve ser informado um diretorio!");  
		if ( !path.exists() ) throw new RuntimeException("Diretorio nao existe. ["+path.getAbsolutePath()+"]");  
		if ( !path.isDirectory() ) throw new RuntimeException("Deve ser informado um diretorio. ["+path.getAbsolutePath()+"]");  
		if ( !path.canRead() ) throw new RuntimeException("Sem permissao no diretorio. ["+path.getAbsolutePath()+"]");  

		quantidade += path.list(new FiltroArquivo(Pattern.compile(".*"+extensao))).length;  

		File pastasDentro[] = path.listFiles(new FiltroDiretorio(Pattern.compile(".*")));  

		for (File pastaDentro : pastasDentro)  
			quantidade += contarArquivos(pastaDentro, extensao);
		return quantidade;  
	}  

	private class FiltroArquivo implements FilenameFilter{  
		private final Pattern jexl;  

		public FiltroArquivo(Pattern expressaoRegular) {  
			this.jexl  = expressaoRegular;  
		}  

		public boolean accept(File path, String nome) {  
			return jexl.matcher(nome).matches();  
		}  
	}  

	private class FiltroDiretorio implements FilenameFilter{  
		private final Pattern jexl;  

		public FiltroDiretorio(Pattern expressaoRegular) {  
			this.jexl  = expressaoRegular;  
		}  


		public boolean accept(File path, String nome) {  
			return new File(path.getAbsolutePath()+File.separator+nome).isDirectory() && jexl.matcher(nome).matches();  
		}  
	}  
}

3 Respostas

kaoe

Verifica se o arquivo termina em .js e não em js. Você também pode usar o !file.isDirectory() se estou certo a expressão abaixo deve funcionar.

FiltroArquivo(Pattern.compile(".*\\."+extensao))).length;
K

Concordo plenamente com o kaoe

F

kaoe:

FiltroArquivo(Pattern.compile(".*\\."+extensao))).length;

Ai kaoe o filtro funcionou redondo, valeu mesmo !!!

Abraço

Criado 28 de agosto de 2008
Ultima resposta 28 de ago. de 2008
Respostas 3
Participantes 3