如何在java中获取目录的最后修改date和时间

看,问题是在Java中,我们可以通过filename.lastModified()获取上次修改的date。 但在Windows中,发生的情况是每当文件被修改时,只有该文件的date和时间被修改,而不是整个文件夹的修改。 所以我想知道什么时候最后一次在该文件夹中修改了一个文件,使用Java?

在目录的文件中找到最新(最大)的lastModified() ,或者如果没有使用该目录本身:

 public static Date getLastModified(File directory) { File[] files = directory.listFiles(); if (files.length == 0) return new Date(directory.lastModified()); Arrays.sort(files, new Comparator<File>() { public int compare(File o1, File o2) { return new Long(o2.lastModified()).compareTo(o1.lastModified()); //latest 1st }}); return new Date(files[0].lastModified()); } 

仅供参考此代码已经过测试(和它的作品)。

我写了一小段代码,在所有子目录中进行递归搜索,并返回最新的修改日期。 它做了深入的搜索,所以你可能不想在根目录下运行它。 这里是代码(我没有严格测试):

 private static long getLatestModifiedDate(File dir) { File[] files = dir.listFiles(); long latestDate = 0; for (File file : files) { long fileModifiedDate = file.isDirectory() ? getLatestModifiedDate(file) : file.lastModified(); if (fileModifiedDate > latestDate) { latestDate = fileModifiedDate; } } return Math.max(latestDate, dir.lastModified()); } 

它假定提供的File是一个目录,并且本身也返回一个long而不是Date 。 如果需要,您可以使用Date的构造函数将long转换为Date (通常不需要)。

这是一个使用FileTimePathJava 7解决方案:

 import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.FileTime; import java.text.SimpleDateFormat; import static java.nio.file.FileVisitResult.CONTINUE; public class NewestFileVisitor extends SimpleFileVisitor<Path> { private FileTime newestFileTime; private String targetExtension; public NewestFileVisitor(String targetExtension) { this.newestFileTime = FileTime.fromMillis(0); this.targetExtension = targetExtension; } @Override public FileVisitResult visitFile(Path filePath, BasicFileAttributes basicFileAttributes) throws IOException { if (filePath.toString().endsWith(targetExtension)) { FileTime lastModified = Files.getLastModifiedTime(filePath); // Newer? if (lastModified.compareTo(newestFileTime) > 0) { newestFileTime = lastModified; } } return CONTINUE; } public String getLastModified() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); long milliseconds = newestFileTime.toMillis(); return simpleDateFormat.format(milliseconds); } } 

用法:

 String folder = "..."; NewestFileVisitor fileVisitor = new NewestFileVisitor(".txt"); Files.walkFileTree(Paths.get(folder), fileVisitor); System.out.println(fileVisitor.getLastModified()); 

示例输出:

 07/08/2016 04:32 PM 

这是从这里的Oracle教程中衍生出来的。

您可以使用WatchService如果您正在使用Java7。

那么,如果是系统或文件系统记录更新的方式,则可能需要在目录中执行递归循环。 对于目录和任何子目录中的每个文件,执行lastModified并保持最新的值。

我看到的方式,你可以写这样的(未经测试):

 long latestModified = 0; File[] files = directory.listFiles(); for(File file : files) { if (latestModified < file.lastModified()) { latestModified = file.lastModified(); } } 

latestModified是你可以使用的变量。

我相信这样你将无法得到正确的修改日期的文件夹,因为有一种情况下,文件被创建/修改,然后从文件夹中删除。

然后上面的逻辑将只显示基于文件夹中的文件的最后修改日期。 它不会考虑被删除的那个。

所以当你比较java程序和OS的最后修改日期时,它可能会有所不同。

恕我直言,我们应该查询操作系统获取文件夹的最后修改日期。