如何在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】:

这是使用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

这是来自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中获取目录的最后修改日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

在Java中获取文件的最后修改日期

如何在Filesystem中获取最后修改日期和时间?

如何在 Go 中获取文件的最后访问日期和时间?

获取git目录中文件的最后修改日期

如何获取联系人列表的最后修改日期(添加/删除/修改)

在两个表mysql上左连接时获取最后修改日期