看,问题是在Java中,我们可以通过filename.lastModified()
得到 lastmodified 日期。但在Windows中,正在发生的事情是,无论何时修改文件,只修改该文件的日期和时间,而不是整个文件夹。所以我想知道最后一次使用Java在该文件夹中修改一个文件的时间是什么时候?
答案 0 :(得分:7)
在目录的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());
}
仅供参考,此代码已经过测试(并且有效)。
答案 1 :(得分:3)
我编写了一小段代码,在所有子目录中进行递归搜索并返回最新的修改日期。它进行深度搜索,因此您可能不希望在根目录中运行它。这是代码(我没有严格测试过):
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
。如果需要,您可以使用long
的构造函数将Date
转换为Date
(通常不需要)。
答案 2 :(得分:1)
我相信这样你就无法获得文件夹的正确修改日期,因为有一种情况是创建/修改文件然后从文件夹中删除。
然后,上面的逻辑将仅显示基于文件夹中存在的文件的最后修改日期。它不会考虑被删除的那个。
因此,当您比较java程序和操作系统的最后修改日期时,它可能会有所不同。
恕我直言,我们应该查询操作系统以获取文件夹的最后修改日期。
答案 3 :(得分:1)
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());
这是从here的Oracle教程中派生出来的。
答案 4 :(得分:0)
您可以使用WatchService如果您使用的是Java7。
答案 5 :(得分:0)
好吧,如果是系统或文件系统记录更新的方式,那么您可能需要在目录中执行递归循环。对于目录和任何子目录中的每个文件,执行lastModified
,并保留最新值。
答案 6 :(得分:0)
我看到它的方式,你可以写这样的东西(未经测试):
long latestModified = 0;
File[] files = directory.listFiles();
for(File file : files) {
if (latestModified < file.lastModified()) {
latestModified = file.lastModified();
}
}
latestModified
是您可以使用的变量。