8

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

4

7 回答 7

8

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

仅供参考,此代码已经过测试(并且可以正常工作)。

于 2012-09-03T14:04:49.047 回答
4

我编写了一小段代码,它在所有子目录中进行递归搜索并返回最新的修改日期。它会进行深度搜索,因此您可能不想在根目录左右运行它。这是代码(我没有严格测试过):

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的是一个目录,并且还返回一个longnot aDate本身。如果需要(通常不需要),您可以使用的构造函数转换long为。DateDate

于 2015-11-14T11:05:04.953 回答
3

这是Java 7使用FileTimeand的解决方案Path

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 教程中得出的。

于 2016-07-08T14:38:18.107 回答
1

我相信这样您将无法获得文件夹的正确修改日期,因为有时会创建/修改文件然后从文件夹中删除。

然后上面的逻辑将仅根据文件夹中存在的文件显示最后修改日期。它不会考虑被删除的那个。

因此,当您比较 java 程序和操作系统的上次修改日期时,它可能会有所不同。

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

于 2014-04-17T03:01:50.593 回答
0

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

于 2012-09-03T13:58:49.013 回答
0

在我看来,你可以写这样的东西(未经测试):

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

latestModified是您可以使用的变量。

于 2012-09-03T13:59:04.800 回答
0

如果您使用的是Java7,则可以使用 WatchService。

于 2012-09-03T13:54:47.733 回答