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 ?
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…
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…
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]
[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]
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);