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();
}
}
}