如何在Java中的目录中找到最后修改的文件?

如何在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; } 

结合这两个:

  1. 您可以使用File.lastModified()获取文件的上次修改时间。
  2. 要列出目录中的所有文件,请使用File.listFiles()

请注意,在Java中, java.io.File对象用于目录和文件。

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

这对我很有用

您可以使用File.lastModified()方法检索上次修改的时间。 我建议的解决方案是实现一个自定义Comparator,它在lastModified()中进行排序 – 将所有文件放在TreeSet中,使用这个比较器进行排序。

未经测试的例子:

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

如果你只需要最后一个文件,Bozho建议的解决方案可能会更快。 另一方面,如果您需要做一些更复杂的事情,这可能会有用。

您的问题类似于: 如何使用Java从目录中仅获取10个最后修改过的文件?

只需将filter代码更改为只有一个文件,接受方法应该只比较两个时间戳。

未经测试的代码:

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

现在,使用此filter的实例作为参数调用dir.listFiles。 最后,filter.topFile是最后修改的文件。

Emil的解决方案中的比较器会更加清洁

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

(a.lastModified() - b.lastModified())int可能会产生意外结果。

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

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

假设变量thePath包含我们要搜索的目录,下面的代码片段返回其中的最后一个修改过的文件:

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

它的作用是,首先按照反向的最后修改时间对文件进行排序,然后跳过目录本身,最后获取流中的第一个元素(这是最后一个修改过的元素)。