[英]How to get the last modified date and time of a directory in java
看,問題是在Java中,我們可以通過filename.lastModified()
獲得lastmodified date。 但在Windows中,正在發生的事情是,無論何時修改文件,只修改該文件的日期和時間,而不是整個文件夾。 所以我想知道最后一次使用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
(通常不需要)。
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教程這里 。
我相信這樣你就無法獲得文件夾的正確修改日期,因為有一種情況是創建/修改文件然后從文件夾中刪除。
然后,上面的邏輯將僅顯示基於文件夾中存在的文件的最后修改日期。 它不會考慮刪除的那個。
因此,當您比較java程序和操作系統的最后修改日期時,它可能會有所不同。
恕我直言,我們應該查詢操作系統獲取文件夾的最后修改日期。
您可以使用WatchService如果您使用的是Java7。
好吧,如果它是系統或文件系統記錄更新的方式,那么您可能需要在目錄中執行遞歸循環。 對於目錄和任何子目錄中的每個文件,執行lastModified
,並保留最新值。
我看到它的方式,你可以寫這樣的東西(未經測試):
long latestModified = 0;
File[] files = directory.listFiles();
for(File file : files) {
if (latestModified < file.lastModified()) {
latestModified = file.lastModified();
}
}
latestModified
是您可以使用的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.