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

6 respostas
lina

Oi,

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

Bom, tenho a seguinte codificação:

//
// 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]);

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!

6 Respostas

L

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…

rod

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

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…

lina

Oi,

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

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

Tchauzin!

lina

Oi,

melhorando o código ainda +

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

Tchauzin!

lina

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...):

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

Tchauzin!

Criado 28 de julho de 2009
Ultima resposta 28 de jul. de 2009
Respostas 6
Participantes 3