31

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

4

9 回答 9

51
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;
}
于 2010-01-14T14:26:56.353 回答
8

结合这两个:

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

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

于 2010-01-14T14:25:55.677 回答
7
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;
}

这对我很有用

于 2012-09-09T08:48:27.323 回答
4

您可以使用 File.lastModified() 方法检索上次修改的时间。我建议的解决方案是实现一个按 lastModified()-order 排序的自定义比较器,并将目录中的所有文件插入到使用此比较器排序的 TreeSet 中。

未经测试的例子:

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

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

于 2010-01-14T14:26:33.660 回答
2

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

只需将过滤器代码更改为只有一个文件,并且接受方法应该简单地比较两个时间戳。

未经测试的代码:

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

    }

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

于 2011-02-16T06:46:50.363 回答
2

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

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

它的作用是:

  • 首先按文件的最后修改时间对文件进行反向排序,
  • 然后跳过目录本身,
  • 最后取流中的第一个元素(这是最后修改的元素)。
于 2017-04-27T21:14:46.403 回答
1

埃米尔解决方案中的比较器会更干净

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会产生意想不到的结果。

于 2010-01-14T15:12:21.613 回答
1
    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());
    }

}
于 2014-06-05T07:18:21.400 回答
1

爪哇 8

Optional<Path> 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);
    }
}
于 2018-03-20T18:26:10.583 回答