如何在java中获取目录的最后修改日期和时间
Posted
技术标签:
【中文标题】如何在java中获取目录的最后修改日期和时间【英文标题】:How to get the last modified date and time of a directory in java 【发布时间】:2012-09-03 13:49:02 【问题描述】:看,问题是在 Java 中,我们可以通过filename.lastModified()
获取 lastmodified 日期。但在 Windows 中,发生的情况是,每当修改文件时,只会修改该文件的日期和时间,而不是整个文件夹的日期和时间。所以我想知道上一次使用 Java 修改该文件夹中的一个文件是什么时候?
【问题讨论】:
【参考方案1】:在目录的files 中查找最新的(最大的)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());
仅供参考,此代码已经过测试(并且有效)。
【讨论】:
不需要排序吗?为什么不迭代并跟踪最近的修改? @Visage 不必要,但我更喜欢单行代码而不是编写循环。 @Bohemian 我的 android 手机的 SD 卡中有一个文件夹,我从中手动删除了一个文件。但是当我从上面的代码中获得最后一次更新时间时,它不会将删除时间作为最后一次更新时间。为什么? 嗨@Bohemian♦ 正如@prateek 所说,有一个错误。您需要将结果与目录的最后修改时间进行比较,因为在删除的情况下,最后修改时间实际上是目录的最后修改时间。 Files.listFiles () 如果您要检查的只是一个正在修改的文件,则执行将需要很长时间。有什么办法不用listFiles()?【参考方案2】:我编写了一小段代码,它在所有子目录中进行递归搜索并返回最新的修改日期。它会进行深度搜索,因此您可能不想在根目录左右运行它。这是代码(我没有严格测试过):
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
。
【讨论】:
【参考方案3】:这是使用FileTime
和Path
的Java 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
这是来自here 的 Oracle 教程。
【讨论】:
【参考方案4】:我相信这样您将无法获得文件夹的正确修改日期,因为在某些情况下,文件被创建/修改然后从文件夹中删除。
那么上述逻辑将仅根据文件夹中存在的文件显示上次修改日期。它不会考虑被删除的那个。
因此,当您比较 java 程序和操作系统的上次修改日期时,它可能会有所不同。
恕我直言,我们应该查询操作系统以获取文件夹的最后修改日期。
【讨论】:
【参考方案5】:如果你使用Java7,你可以使用WatchService。
【讨论】:
【参考方案6】:好吧,如果它是系统或文件系统记录更新的方式,那么您可能需要在目录内执行递归循环。对于目录中的每个文件和任何子目录,执行lastModified
,并保留最新的值。
【讨论】:
【参考方案7】:在我看来,你可以这样写(未经测试):
long latestModified = 0;
File[] files = directory.listFiles();
for(File file : files)
if (latestModified < file.lastModified())
latestModified = file.lastModified();
latestModified
是您可以使用的变量。
【讨论】:
以上是关于如何在java中获取目录的最后修改日期和时间的主要内容,如果未能解决你的问题,请参考以下文章