Receber arquivo com a data maior dentro de um diretório [RESOLVIDO, Melhorada a solução++]

Oi,

Acredito que está duvida venha a ser um pouco complicada.

Bom, tenho a seguinte codificação:

[code]//
// Carrega os arquivos do diretório corrente.
//
File
lo_file_configuracao = new File(".");

//
// Filtra pela extensão do arquivo.
//
FilenameFilter
lo_file_extension = new FilenameFilter()
{
public
boolean accept
(
File ao_file,
String as_name
)
{
//
// Retorna os arquivos com a extensão ‘.conf’
//
return (
as_name.endsWith(".LINA")
);
}
};

//
// Recebe uma lista contendo todos os arquivos .LINA do diretório corrente.
//
String[]
lo_list_files = lo_file_configuracao.list(lo_file_extension);

File
lo_file = new File(lo_list_files[0]);

[/code]

A codificação acima, irá me retornar todos os arquivo do diretório corrente com a extensão .LINA.
Porém, eu gostaria de receber apenas o último com maior data.

Exemplo:

auto.LINA data = 27/07/2009
auto.LINA data = 28/07/2009

Quere pegar apenas o com a data de dia 28, pois é + atual.

Eu sei que tenho um método do File chamado LastModified()… mas se eu tenho 60 arquivos, eu terei que fazer varias comparações com Data ?

Tchauzin!

Ola Lina…

O que vc pode fazer é ordenar a lista de forma inversa, ou seja, do maior para o menor, o primeiro posição do seu array vai ser a data mais atualizada…

exemplo…

        String [] s = new String[]{"17/02/2004","18/02/2004"};
        Arrays.sort(s, new Comparator<String>() {
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });

o resultado será
[0] - 18/02/2004
[1] - 17/02/2004

as datas acima considere como a ultima modificação…

espero que te ajude…

Lina,

Com esse codigo voce consegue pegar a data de ultima modificacao do arquivo, dai é so comparar e ver qual é o ultimo. :wink:

long ultimaModificacaoEmMilisegundos = lo_file.lastModified();

Te ajudando um pouco mais…

        File [] files = new File(LOCAL_DA_PROCURA).listFiles();
        Arrays.sort(files, new Comparator<File>() {
            public int compare(File o1, File o2) {
                return Long.valueOf(o2.lastModified()).compareTo(Long.valueOf(o1.lastModified()));
                // PODE SER ASSIM return (o1.lastModified() - o2.lastModified() <= 0 ? 1 : -1);
               /* OU AINDA ASSIM
                Date dt1 = new Date(o1.lastModified());
                Date dt2 = new Date(o2.lastModified());
                return dt2.compareTo(dt1);
              
               */
            }
        });

        for(File f : files){
            System.out.println(f.getName() +  " - lastMofication " + new Date(f.lastModified()));
        }

a mesma lógica que usei com String porem usando a ultima modificação do arquivo, ou seja, a primeira posição será o arquivo mais atualizado…

Oi,

Gente! muito obrigado pela ajuda! Olhando a codificações de vocês, tive algumas ideias! encontrei algumas informações e fiz assim:

[code]public static final
File getNewerFile
(
String as_dir,
String as_extention
)
{
//
// Carrega os arquivos do diretório informado.
//
File
lo_file = new File(as_dir);

	//
	// Recebe uma lista contendo todos os arquivos do diretório corrente.
	//
	File[] 
	lo_list_file		=	lo_file.listFiles();
	
	//
	// Retornará o arquivo atual presente no diretório corrente.
	//
	File
	lo_file_newer		=	null;

	//
	// Quantidade de arquivos com a mesma extensão presentes no diretório corrente.
	//
	int 
	ln_file_cont		=	0;

	//
	// Percorre a lista de arquivos encontrados...
	//
	for	(
			int
			ln			=	0
			;
			ln			<	lo_list_file.length
			;
			ln++
		)
	{
		//
		// Se a extensão do arquivo for a mesma informada na parametrização ...
		//
		if	(
				(getExtension(lo_list_file[ln])).equals(as_extention)
			)
		{
			ln_file_cont++;
		}
	}

	//
	// Se não existir nenhum arquivo com a extensão informada ...
	//
	if	(
			ln_file_cont		==	0
		)
	{
		return	(null);
	}
	
	//
	// Cria uma lista de tamanho igual a quantidade de arquivos encontrado.
	//
	File[]
	lo_file_extension	=	new File[ln_file_cont];

	int
	ln_1			=	0;
	
	//
	// Percorre a lista de arquivos presentes no diretório corrente ...
	//
	for	(
			int 
			ln			=	0
			;
			ln			<	lo_list_file.length
			;
			ln++
		)
	{
		//
		// Se a extensão do arquivo for a mesma informada na parametrização ...
		//
		if	(
				(getExtension(lo_list_file[ln])).equals(as_extention)
			)
		{
			//
			// Recebe o arquivo e insere na lista.
			//
			lo_file_extension[ln_1] = lo_list_file[ln];
			ln_1++;
		}
	}

	//
	// Se existir apenas 1 arquivo com a extensão passada por parametro ...
	//
	if	(
			lo_file_extension.length		==	1
		)
	{
		//
		// Retorna o arquivo ...
		//
		return	(lo_file_extension[0]);
	}

	//
	// Recebe o arquivo da posição inicial.
	//
	lo_file_newer		=	lo_file_extension[0];
	
	//
	// Percorre a lista de arquivos com a extensão parametrizada ...
	//
	for	(
			int 
			i			=	0
			;
			i			<	lo_file_extension.length - 1
			;
			i++
		)
	{
		//
		// Faz a comparação da data ...
		//
		if	(
				lo_file_newer.lastModified() 	
							<	lo_file_extension[i + 1].lastModified()
			)
		{
			//
			// Recebe o arquivo de mair data (data + atual).
			//
			lo_file_newer	=	lo_file_extension[i + 1];
		}
	}

	//
	// Recebe o arquivo de maior data (data + atual).
	//
	return	(lo_file_newer);
}[/code]

[code] public static final
String getExtension
(
File f
)
{
int
i = f.getName().lastIndexOf(’.’);

	if	(
			i			>	0 
			&&
			i			<	f.getName().length() - 1
		)
	{
		return f.getName().substring(i + 1).toLowerCase();
	}
	
	return " ";
 }[/code]

Tchauzin!

Oi,

melhorando o código ainda +

[code] public static final
File getNewerFile
(
String as_dir,
String as_extention
)
{
//
// Carrega os arquivos do diretório informado.
//
File
lo_file = new File(as_dir);

	//
	// Recebe uma lista contendo todos os arquivos do diretório corrente.
	//
	File[] 
	lo_list_file		=	lo_file.listFiles();
	
	//
	// Retornará o arquivo atual presente no diretório corrente.
	//
	File
	lo_file_newer		=	null;

	//
	// Conterá a lista de arquivo com a extensão parametrizada.
	//		
	ArrayList<File>
	lo_al_file		=	new ArrayList<File>();

	//
	// Percorre a lista de arquivos encontrados...
	//
	for	(
			int
			ln			=	0
			;
			ln			<	lo_list_file.length
			;
			ln++
		)
	{
		//
		// Se a extensão do arquivo for a mesma informada na parametrização ...
		//
		if	(
				(getExtension(lo_list_file[ln])).equals(as_extention)
			)
		{
			lo_al_file.add(lo_list_file[ln]);
		}
	}
	
	//
	// Cria uma lista de tamanho igual a quantidade de arquivos encontrado.
	//
	File[]
	lo_file_extension	=	new File[lo_al_file.size()];
	lo_al_file.toArray(lo_file_extension);

	//
	// Se existir apenas 1 arquivo com a extensão passada por parametro ...
	//
	if	(
			lo_file_extension.length		
						==	1
		)
	{
		//
		// Retorna o único arquivo ...
		//
		lo_file_newer	=	lo_file_extension[0];
	}
	//
	// Se não existir nenhum arquivo ...
	//
	else if	(
			lo_file_extension.length
						==	0
		)
	{
		lo_file_newer	=	null;
	}
	//
	// Se existir varios arquivos com a extensão parametrizada.
	//
	else
	{
		//
		// Recebe o arquivo da posição inicial.
		//
		lo_file_newer		=	lo_file_extension[0];
		
		//
		// Percorre a lista de arquivos com a extensão parametrizada ...
		//
		for	(
				int 
				ln			=	0
				;
				ln			<	lo_file_extension.length - 1
				;
				ln++
			)
		{
			//
			// Faz a comparação da data ...
			//
			if	(
					lo_file_newer.lastModified() 	
								<	lo_file_extension[ln + 1].lastModified()
				)
			{
				//
				// Recebe o arquivo de mair data (data + atual).
				//
				lo_file_newer	=	lo_file_extension[ln + 1];
			}
		}
	}
	
	//
	// Recebe o arquivo de maior data (data + atual).
	//
	return	(lo_file_newer);
}[/code]

Tchauzin!

Oi,

Consegui melhorar um pouco mais… Notei que o código poderia lançar a exceção OutOfMemory (dificilmente)
se for um diretório que contem muitos arquivos, tipo: C:\WINDOWS\System32

Sendo assim, utilizei o método accept do FilenameFilter() que me devolve apenas os arquivos
com a extensão passada por parâmetro. E não precisa mais do método getExtension dos outros post.

Segue (Indentação de vocês…):

[code]public static final
File getNewerFile(String as_dir, String as_extension) {

// Carrega os arquivos do diretório informado.
File lo_file = new File(as_dir);
	
// Recebe a extensão parametrizada.	
final String ls_extension = as_extension;
			
// Filtra pela extensão do arquivo.
FilenameFilter 
lo_file_extension = new FilenameFilter() { 
		
	public bboolean	accept(File ao_file, String as_name) {
			
		// Retorna os arquivos com a extensão '.conf'				
		return	(as_name.endsWith("."+ls_extension)); 
	} 
};

// Recebe uma lista contendo todos os arquivos do diretório corrente.
File[] lo_list_file = lo_file.listFiles(lo_file_extension);
	
// Retornará o arquivo atual presente no diretório corrente.
File lo_file_newer = null;

// Se existir apenas 1 arquivo com a extensão passada por parametro ...
if (lo_list_file.length	== 1) {
	// Retorna o único arquivo ...
	lo_file_newer	=	lo_list_file[0];
}
else if	(lo_list_file.length == 0) {
	lo_file_newer	=	null;
}
else {
	// Recebe o arquivo da posição inicial.
	lo_file_newer =	lo_list_file[0];
		
	// Percorre a lista de arquivos com a extensão parametrizada ...
	for (int ln=0; ln < lo_list_file.length - 1; ln++) {
		// Faz a comparação da data ...
		if (lo_file_newer.lastModified() < lo_list_file[ln + 1].lastModified())	{
			
			// Recebe o arquivo de mair data (data + atual).
			lo_file_newer	=	lo_list_file[ln + 1];
		}
	}
}
	
// Retorna o arquivo de maior data (data + atual).
return	(lo_file_newer);

}[/code]

Tchauzin!