File.list() retornando errado

9 respostas
G

Tenho um ambiente windows e estou fazendo uma busca numa pasta que tem mais de 50.000 arquivos, quando eu tento fazer o filtro ou passando um FilenameFilter ou na mão, não me retorna nem 10% dos arquivos.

PS.: Estou num ambiente windows.

Segue uma classe de teste que fiz:

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


public class FindDocSigs {	
	public static void list(String[] args) {
		File root = new File(args[0]);
		File[] files = root.listFiles();
		List<File> matchedFiles = new ArrayList<File>();
		if (files != null) {
			if (files.length == 0) {
				System.out.println("No files in the folder.");
			} else {
				String docPattern = ".*\.doc";
				System.out.println("Files in the folder: "+files.length);
				System.out.println(root.getAbsolutePath());
				for (int i = 0; i < files.length; i++) {
					if (files[i].getName().matches(docPattern)) {
						matchedFiles.add(files[i]);
					}
				}
			}
		}
		System.out.println("Files found: "+matchedFiles.size());
	}
	
	public static void listFilter(String[] args) {
		File[] files = new File(args[0]).listFiles(new DocFilenameFilter ());
		if (files != null) {
			if (files.length == 0) {
				System.out.println("No files matched the pattern.");
			} else {
				for (int i = 0; i < files.length; i++) {
					System.out.println(files[i].getName());
				}
			}
		} else {
			System.out.println("No files found.");
		}
	}

	private static class DocFilenameFilter implements FilenameFilter {
		private String docPattern = null;
		DocFilenameFilter() {
			docPattern = ".*\.doc";
		}
		public boolean accept(File dir, String name) {
			System.out.println(name+": "+name.matches(docPattern));
			return name.matches(docPattern);
		}
	}
}

9 Respostas

T

Não se esqueça que em Windows os arquivos podem ter o nome “.doc” ou “.DOC” e ainda assim serem reconhecidos pelo Word.

Mas seu filtro não leva isso em conta, portanto você deve ter 10% dos arquivos terminados com o nome “.doc” (em minúsculas) e os outros 90% com “.DOC” ou “.Doc” ou outra coisa (em maiúsculas).

Mude seu filtro para algo como:

if (files[i].getName().toLowerCase().endsWith (".doc")) ...

A vantagem é que no seu caso é mais rápido checar “endsWith” que usar uma expressão regular.

G

Sim, sim, mas o filtro nem é o mérito da questão. O problema eh que o list() não está retornando todos os arquivos. A minha regexp é um pouco mais complexa que essa. Coloquei essa só pra ilustrar o test que fiz. O meu problema é ele listar tudo.

T

Você precisa fazer uma busca recursiva, ou é apenas um diretório que tem 50.000 arquivos?

G

Apenas 1 diretório com 50000 arquivos.

T

Que monstruosidade, 50.000 arquivos em um único diretório… Por via das dúvidas, vou fazer um teste aqui e ver quem explode primeiro (se o Windows ou o Java).

G

Pra ser sincero, chutei baixo quando disse 50k arquivos. A aplicação usa o file system de um jeito meio zuado! Mas o meu problema é que parece que o java tá ignorando um monte desses arquivos. Como vc pode ver em uma das minhas implementações de teste eu printo o número total de arquivos encontrados. Ele me retornou +/- 5000. Fui pelo windows e cliquei com e vi as propriedades da pastas, rapidamente a contagem de arquivos ultrapassou esse valor. Sei que essa contagem é recursiva, mas como sei que não tem outros diretórios dentro desse …

Bom, se alguém souber de algum problema do genêro com a interação java X windows no que diz respeito a FileSystem, por favor uma luz seria de grande ajuda!

T

Criei 70.000 arquivos em um único diretório, com nomes aleatórios, e não tive problemas.

T

Só acredito que são 50.000 arquivos em um único diretório (e não em vários subdiretórios) se você executar o comando “dir” (em uma linha de comando, é claro) nesse diretório.

Se usar “dir /s” (o comando recursivo) e só assim der 50.000 arquivos, então você precisa efetuar a listagem recursiva.

G

Tanto abrir a pasta pelo explorer quanto usando o dir demora muito pra responder (no caso do explorer trava). Quando a gnt precisa de algum arquivo de lá, a gnt usa a procura do SO.

Criado 11 de junho de 2008
Ultima resposta 11 de jun. de 2008
Respostas 9
Participantes 2