2010-04-27 133 views
76

在StackOverflow上有另一個類似的問題(How to get creation date of a file in Java),但答案並不存在,因爲OP具有可以通過其他機制解決的不同需求。我試圖創建一個目錄中的文件列表,可以按年齡進行排序,因此需要創建文件日期。用Java確定文件創建日期

在網絡的大量拖網之後,我還沒有找到任何好方法來做到這一點。是否有獲取文件創建日期的機制?

順便說一句,目前在Windows系統上,也可能需要在Linux系統上工作。另外,我不能保證在創建日期/時間嵌入到名稱中的情況下會遵循文件命名約定。

+2

好的,經過對文件系統的更多討論和調查之後,我們已經決定使用上次修改是足夠的,因爲它可能必須與創建日期一起檢查。兩者都需要檢查以確定一箇舊文件是否最近被修改並因此仍然是活動的。所以,只需檢查過去最遠修改的文件即可。感謝所有的投入。順便說一句,我很樂意使用nio,但這裏的Linux風格不支持文件創建。 – Todd 2010-04-27 20:07:56

回答

5

該API的java.io.File只支持獲取最後修改時間。互聯網對這個話題也很安靜。

除非我遺漏了一些重要的東西,否則Java庫(直到但尚未包括Java 7)都不包含此功能。所以,如果你爲此感到絕望,一種解決方案是編寫一些C(++)代碼來調用系統例程並使用JNI調用它。不過,大部分這項工作似乎已經在名爲JNA的圖書館中爲您完成了。

您可能仍然需要做一些特定的操作系統編碼在Java中這一點,不過,因爲你可能找不到同樣的系統在Windows和Unix/Linux/BSD/OS X.調用可用

+2

是的,Java 7會很好,因爲nio似乎在基本屬性中有這個。從來沒有想過我會抱怨出生得太早! ;) – Todd 2010-04-27 18:45:09

+6

「File」類沒有這種能力的原因是大多數文件系統甚至不跟蹤這些信息。而那些並不總是同意什麼時候應該更新。 – Syntactic 2010-04-27 18:50:34

+0

@語言,非常好的一點。 – 2010-04-27 18:59:45

113

只要文件系統提供它,Java nio就可以選擇訪問creationTime和其他元數據。 檢查this link

例如(提供基於@ ydaetskcoR的評論):

Path file = ...; 
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); 

System.out.println("creationTime: " + attr.creationTime()); 
System.out.println("lastAccessTime: " + attr.lastAccessTime()); 
System.out.println("lastModifiedTime: " + attr.lastModifiedTime()); 
+1

看起來像要走的路 – 2010-04-27 18:54:38

+13

這將是最好的,但它是Java 7.我們仍在使用6,但我會調查我們的升級選項。 – Todd 2010-04-27 19:00:51

+1

太棒了。正是我需要的。 – RestInPeace 2015-10-27 09:24:28

9

在Windows系統中,你可以使用免費的FileTimes庫。

這將在未來更容易Java NIO.2 (JDK 7) and the java.nio.file.attribute package

但請記住,大多數Linux文件系統don't support file creation timestamps

+0

任何其他方式的Linux機器不支持創建時間? – Maverick 2015-05-21 06:52:20

+0

只需使用支持文件創建時間戳的文件系統即可。鏈接的維基百科文章建議ext4現在很常見。 – davtom 2015-05-21 09:22:42

12

作爲這個問題的一個後續 - 由於它與創建時間有關,並討論了通過新的nio類獲取它 - 現在看來,在JDK7的實現中,你運氣不好。附錄:在OpenJDK7中也有相同的行爲。

在Unix文件系統上,您無法檢索創建時間戳,只需獲取上次修改時間的副本。很傷心,但不幸的是。我不確定這是爲什麼,但代碼專門做到這一點,如下所示。

import java.io.IOException; 
import java.nio.file.*; 
import java.nio.file.attribute.*; 

public class TestFA { 
    static void getAttributes(String pathStr) throws IOException { 
    Path p = Paths.get(pathStr); 
    BasicFileAttributes view 
     = Files.getFileAttributeView(p, BasicFileAttributeView.class) 
       .readAttributes(); 
    System.out.println(view.creationTime()+" is the same as "+view.lastModifiedTime()); 
    } 
    public static void main(String[] args) throws IOException { 
    for (String s : args) { 
     getAttributes(s); 
    } 
    } 
} 
+0

你知道如何爲Android做到這一點嗎? BasicFileAttributes不可用,因爲它內置了API ... – 2016-01-23 23:31:53

10

我已經解決了使用JDK 7的代碼這個問題:

package FileCreationDate; 

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.Date; 
import java.util.concurrent.TimeUnit; 

public class Main 
{ 
    public static void main(String[] args) { 

     File file = new File("c:\\1.txt"); 
     Path filePath = file.toPath(); 

     BasicFileAttributes attributes = null; 
     try 
     { 
      attributes = 
        Files.readAttributes(filePath, BasicFileAttributes.class); 
     } 
     catch (IOException exception) 
     { 
      System.out.println("Exception handled when trying to get file " + 
        "attributes: " + exception.getMessage()); 
     } 
     long milliseconds = attributes.creationTime().to(TimeUnit.MILLISECONDS); 
     if((milliseconds > Long.MIN_VALUE) && (milliseconds < Long.MAX_VALUE)) 
     { 
      Date creationDate = 
        new Date(attributes.creationTime().to(TimeUnit.MILLISECONDS)); 

      System.out.println("File " + filePath.toString() + " created " + 
        creationDate.getDate() + "/" + 
        (creationDate.getMonth() + 1) + "/" + 
        (creationDate.getYear() + 1900)); 
     } 
    } 
} 
8

這是如何得到一個文件的Java創建日期一個基本的例子,用BasicFileAttributes類:

Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt"); 
    BasicFileAttributes attr; 
    try { 
    attr = Files.readAttributes(path, BasicFileAttributes.class); 
    System.out.println("Creation date: " + attr.creationTime()); 
    //System.out.println("Last access date: " + attr.lastAccessTime()); 
    //System.out.println("Last modified date: " + attr.lastModifiedTime()); 
    } catch (IOException e) { 
    System.out.println("oops error! " + e.getMessage()); 
} 
0

對於Windows系統,您可以嘗試this教程,它表明對Java的版本解決方法的Java 7之前....