2010-01-14 21 views

Respuesta

38
private File getLatestFilefromDir(String dirPath){ 
    File dir = new File(dirPath); 
    File[] files = dir.listFiles(); 
    if (files == null || files.length == 0) { 
     return null; 
    } 

    File lastModifiedFile = files[0]; 
    for (int i = 1; i < files.length; i++) { 
     if (lastModifiedFile.lastModified() < files[i].lastModified()) { 
      lastModifiedFile = files[i]; 
     } 
    } 
    return lastModifiedFile; 
} 
+0

Pensé que sería más limpio usar un comparador personalizado, pero de esta manera es más rápido. –

+4

utilizando un comparador es una buena práctica, pero esta es una tarea sencilla y podría prescindir de ella. – Bozho

+0

no. cuanto mayor sea el valor largo, más tarde se modificará el archivo. Si ese fue el motivo del voto a favor, no dude en deshacerlo;) – Bozho

8

combinar estas dos:

  1. Puede obtener la última modificación de un archivo usando File.lastModified().
  2. Para enumerar todos los archivos en un directorio, use File.listFiles().

Tenga en cuenta que en Java el objeto java.io.File se utiliza para los directorios y archivos.

4

Puede recuperar la hora de la última modificación utilizando el método File.lastModified(). Mi solución sugerida sería implementar un comparador personalizado que ordene en lastModified() - ordenar e insertar todos los archivos en el directorio en un TreeSet que ordena usando este comparador.

ejemplo no probado:

SortedSet<File> modificationOrder = new TreeSet<File>(new Comparator<File>() { 
    public int compare(File a, File b) { 
     return (int) (a.lastModified() - b.lastModified()); 
    } 
}); 

for (File file : myDir.listFiles()) { 
    modificationOrder.add(file); 
} 

File last = modificationOrder.last(); 

La solución sugerida por Bozho es probablemente más rápido si sólo necesita el último archivo. Por otro lado, esto podría ser útil si necesitas hacer algo más complicado.

0

El comparador en solución de Emil sería más limpia de esta manera

public int compare(File a, File b) { 
    if ((a.lastModified() < b.lastModified())) { 
     return 1; 
    } else if ((a.lastModified() > b.lastModified())) { 
     return -1; 
    } 
    return 0; 
} 

casting (a.lastModified() - b.lastModified()) a int puede producir resultados inesperados.

1

Su problema es similar a: How to get only 10 last modified files from directory using Java?

Sólo cambia el código del filtro para tener un solo archivo y el método de aceptar simplemente debe comparar las dos marcas de tiempo.

código no probado:

 class TopFileFilter implements FileFilter { 

     File topFile; 

     public boolean accept(File newF) { 
      if(topFile == null) 
       topFile = newF; 
      else if(newF.lastModified()>topFile.lastModified()) 
       topFile = newF; 
      return false; 
     } 

    } 

ahora, dir.listFiles de llamadas con una instancia de este filtro como argumento. Al final, filter.topFile es el último archivo modificado.

5
import org.apache.commons.io.comparator.LastModifiedFileComparator; 
import org.apache.commons.io.filefilter.WildcardFileFilter; 

... 
... 

/* Get the newest file for a specific extension */ 
public File getTheNewestFile(String filePath, String ext) { 
    File theNewestFile = null; 
    File dir = new File(filePath); 
    FileFilter fileFilter = new WildcardFileFilter("*." + ext); 
    File[] files = dir.listFiles(fileFilter); 

    if (files.length > 0) { 
     /** The newest file comes first **/ 
     Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE); 
     theNewestFile = files[0] 
    } 

    return theNewestFile; 
} 

Esto funciona muy bien para mí

0
String path = "C:\\Work\\Input\\"; 

    File dir = new File(path); 
    File[] files = dir.listFiles(); 

    Arrays.sort(files, new Comparator<File>() { 
     public int compare(File f1, File f2) { 
      return Long.valueOf(f2.lastModified()).compareTo(
        f1.lastModified()); 
     } 
    }); 

    for (int index = 0; index < files.length; index++) { 
     // Print out the name of files in the directory 
     System.out.println(files[index].getName()); 
    } 

} 
0

Vamos a suponer que la variable thePath contiene el directorio que queremos buscar, el siguiente fragmento devuelve el último archivo modificado en su interior:

Files.walk(thePath) 
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified())) 
.skip(1) 
.findFirst() 

Lo que hace es, primero ordenar los archivos por su última modificación en tiempo inverso, luego omitir el directorio en sí mismo, y finalmente tomar el primer elemento en la secuencia (que es el último una modificación).

+0

Si bien este fragmento de código puede ser la solución, [incluida una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-cobded-answers-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – derM

Cuestiones relacionadas