¿Cómo encuentro el último archivo modificado en un directorio en Java?

¿Cómo encuentro el último archivo modificado en un directorio en Java?

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

Combina estos dos:

  1. Puede obtener la última hora modificada de un archivo utilizando 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 usa para directorios y archivos.

 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 genial para mí

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 modificationOrder = new TreeSet(new Comparator() { 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 probablemente sea más rápida si solo necesitas el último archivo. Por otro lado, esto podría ser útil si necesitas hacer algo más complicado.

Su problema es similar a: ¿Cómo obtener solo 10 últimos archivos modificados del directorio utilizando Java?

Simplemente cambie el código de filtro para tener solo un archivo y el método de aceptación 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, llame a dir.listFiles con una instancia de este filtro como argumento. Al final, filter.topFile es el último archivo modificado.

El comparador en la solución de Emil sería más limpio 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; } 

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

Java 8

 Optional findLastModifiedFile(Path directory) throws IOException { return Files.list(directory) .max(this::compareLastModified); } int compareLastModified(Path p1, Path p2) { try { return Files.getLastModifiedTime(p1).compareTo(Files.getLastModifiedTime(p2)); } catch (IOException e) { throw new RuntimeException(e); } } 
  String path = "C:\\Work\\Input\\"; File dir = new File(path); File[] files = dir.listFiles(); Arrays.sort(files, new Comparator() { 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()); } } 

Supongamos que la variable thePath contiene el directorio que queremos buscar, el siguiente fragmento devuelve el último archivo modificado dentro de él:

 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 el tiempo inverso, luego omitir el directorio y finalmente tomar el primer elemento en la secuencia (que es la última modificación).