2008-08-28 21 views
23

Existe-t-il un moyen facile de découvrir l'heure de création d'un fichier avec Java? La classe File a seulement une méthode pour obtenir l'heure de "dernière modification". Selon certaines ressources trouvées sur Google, la classe File ne fournit pas de méthode getCreationTime() car tous les systèmes de fichiers ne supportent pas l'idée d'une heure de création.Comment découvrir l'heure de création d'un fichier avec Java?

La seule solution de travail que j'ai trouvée involes invoquant la ligne de commande et exécutant la commande "dir", qui semble sortir l'heure de création du fichier. Je suppose que cela fonctionne, j'ai seulement besoin de prendre en charge Windows, mais il semble très enclin à moi.

Y a-t-il des bibliothèques tierces qui fournissent les informations dont j'ai besoin? En fin de compte, je ne pense pas que ça vaut la peine d'acheter la bibliothèque tierce, mais leur API semble assez bonne, donc c'est probablement un bon choix pour quelqu'un d'autre qui a ce problème.

+0

J'ai vérifié le [VFS Apache Commons] (http://commons.apache.org/vfs/), dans lequel un fichier virtuel le système peut exporter un ensemble riche de capacité. Mais malheureusement, il n'y a pas de capacité CREATION_TIME définie, cependant. –

+0

AFAIK, NIO-2 résout ce problème mais n'est pas encore sorti (devrait être dans la 7ème version). Voir par exemple http://java.sun.com/developer/technicalArticles/javase/nio/ et http://today.java.net/article/2009/10/14/sweeping-file-system-nio-2 –

Répondre

1

J'aime la réponse sur jGuru qui énumère l'option d'utiliser JNI pour obtenir la réponse. Cela peut s'avérer plus rapide que le décorticage et vous pouvez rencontrer d'autres situations comme celle-ci qui doivent être implémentées spécifiquement pour les fenêtres. De plus, si vous avez besoin de porter sur une plate-forme différente, vous pouvez également transférer votre bibliothèque et la renvoyer à -1 pour la réponse à cette question sur * ix.

2

J'ai étudié cela moi-même, mais j'ai besoin de quelque chose qui fonctionne sur les plates-formes Windows/* nix.

Un message SO comprend des liens vers Posix JNI implementations.

En particulier, la JNA-Posix implémente methods for getting file stats avec des implémentations pour Windows, BSD, Solaris, Linux et OSX.

Dans l'ensemble, il semble très prometteur, donc je vais essayer sur mon propre projet très bientôt.

7

J'ai écrit une petite classe de test il y a quelques jours, le souhaitent peut vous aider:

// Get/Set windows file CreationTime/LastWriteTime/LastAccessTime 
// Test with jna-3.2.7 
// [http://maclife.net/wiki/index.php?title=Java_get_and_set_windows_system_file_creation_time_via_JNA_(Java_Native_Access)][1] 

import java.io.*; 
import java.nio.*; 
import java.util.Date; 

// Java Native Access library: jna.dev.java.net 
import com.sun.jna.*; 
import com.sun.jna.ptr.*; 
import com.sun.jna.win32.*; 
import com.sun.jna.platform.win32.*; 

public class WindowsFileTime 
{ 
    public static final int GENERIC_READ = 0x80000000; 
    //public static final int GENERIC_WRITE = 0x40000000; // defined in com.sun.jna.platform.win32.WinNT 
    public static final int GENERIC_EXECUTE = 0x20000000; 
    public static final int GENERIC_ALL = 0x10000000; 

    // defined in com.sun.jna.platform.win32.WinNT 
    //public static final int CREATE_NEW = 1; 
    //public static final int CREATE_ALWAYS = 2; 
    //public static final int OPEN_EXISTING = 3; 
    //public static final int OPEN_ALWAYS = 4; 
    //public static final int TRUNCATE_EXISTING = 5; 

    public interface MoreKernel32 extends Kernel32 
    { 
     static final MoreKernel32 instance = (MoreKernel32)Native.loadLibrary ("kernel32", MoreKernel32.class, W32APIOptions.DEFAULT_OPTIONS); 
     boolean GetFileTime (WinNT.HANDLE hFile, WinBase.FILETIME lpCreationTime, WinBase.FILETIME lpLastAccessTime, WinBase.FILETIME lpLastWriteTime); 
     boolean SetFileTime (WinNT.HANDLE hFile, final WinBase.FILETIME lpCreationTime, final WinBase.FILETIME lpLastAccessTime, final WinBase.FILETIME lpLastWriteTime); 
    } 

    static MoreKernel32 win32 = MoreKernel32.instance; 
    //static Kernel32 _win32 = (Kernel32)win32; 

    static WinBase.FILETIME _creationTime = new WinBase.FILETIME(); 
    static WinBase.FILETIME _lastWriteTime = new WinBase.FILETIME(); 
    static WinBase.FILETIME _lastAccessTime = new WinBase.FILETIME(); 

    static boolean GetFileTime (String sFileName, Date creationTime, Date lastWriteTime, Date lastAccessTime) 
    { 
     WinNT.HANDLE hFile = OpenFile (sFileName, GENERIC_READ); // may be WinNT.GENERIC_READ in future jna version. 
     if (hFile == WinBase.INVALID_HANDLE_VALUE) return false; 

     boolean rc = win32.GetFileTime (hFile, _creationTime, _lastAccessTime, _lastWriteTime); 
     if (rc) 
     { 
      if (creationTime != null) creationTime.setTime (_creationTime.toLong()); 
      if (lastAccessTime != null) lastAccessTime.setTime (_lastAccessTime.toLong()); 
      if (lastWriteTime != null) lastWriteTime.setTime (_lastWriteTime.toLong()); 
     } 
     else 
     { 
      int iLastError = win32.GetLastError(); 
      System.out.print ("获取文件时间失败,错误码:" + iLastError + " " + GetWindowsSystemErrorMessage (iLastError)); 
     } 
     win32.CloseHandle (hFile); 
     return rc; 
    } 
    static boolean SetFileTime (String sFileName, final Date creationTime, final Date lastWriteTime, final Date lastAccessTime) 
    { 
     WinNT.HANDLE hFile = OpenFile (sFileName, WinNT.GENERIC_WRITE); 
     if (hFile == WinBase.INVALID_HANDLE_VALUE) return false; 

     ConvertDateToFILETIME (creationTime, _creationTime); 
     ConvertDateToFILETIME (lastWriteTime, _lastWriteTime); 
     ConvertDateToFILETIME (lastAccessTime, _lastAccessTime); 

     //System.out.println ("creationTime: " + creationTime); 
     //System.out.println ("lastWriteTime: " + lastWriteTime); 
     //System.out.println ("lastAccessTime: " + lastAccessTime); 

     //System.out.println ("_creationTime: " + _creationTime); 
     //System.out.println ("_lastWriteTime: " + _lastWriteTime); 
     //System.out.println ("_lastAccessTime: " + _lastAccessTime); 

     boolean rc = win32.SetFileTime (hFile, creationTime==null?null:_creationTime, lastAccessTime==null?null:_lastAccessTime, lastWriteTime==null?null:_lastWriteTime); 
     if (! rc) 
     { 
      int iLastError = win32.GetLastError(); 
      System.out.print ("设置文件时间失败,错误码:" + iLastError + " " + GetWindowsSystemErrorMessage (iLastError)); 
     } 
     win32.CloseHandle (hFile); 
     return rc; 
    } 
    static void ConvertDateToFILETIME (Date date, WinBase.FILETIME ft) 
    { 
     if (ft != null) 
     { 
      long iFileTime = 0; 
      if (date != null) 
      { 
       iFileTime = WinBase.FILETIME.dateToFileTime (date); 
       ft.dwHighDateTime = (int)((iFileTime >> 32) & 0xFFFFFFFFL); 
       ft.dwLowDateTime = (int)(iFileTime & 0xFFFFFFFFL); 
      } 
      else 
      { 
       ft.dwHighDateTime = 0; 
       ft.dwLowDateTime = 0; 
      } 
     } 
    } 

    static WinNT.HANDLE OpenFile (String sFileName, int dwDesiredAccess) 
    { 
     WinNT.HANDLE hFile = win32.CreateFile (
      sFileName, 
      dwDesiredAccess, 
      0, 
      null, 
      WinNT.OPEN_EXISTING, 
      0, 
      null 
      ); 
     if (hFile == WinBase.INVALID_HANDLE_VALUE) 
     { 
      int iLastError = win32.GetLastError(); 
      System.out.print (" 打开文件失败,错误码:" + iLastError + " " + GetWindowsSystemErrorMessage (iLastError)); 
     } 
     return hFile; 
    } 
    static String GetWindowsSystemErrorMessage (int iError) 
    { 
     char[] buf = new char[255]; 
     CharBuffer bb = CharBuffer.wrap (buf); 
     //bb.clear(); 
     //PointerByReference pMsgBuf = new PointerByReference(); 
     int iChar = win32.FormatMessage (
       WinBase.FORMAT_MESSAGE_FROM_SYSTEM 
        //| WinBase.FORMAT_MESSAGE_IGNORE_INSERTS 
        //|WinBase.FORMAT_MESSAGE_ALLOCATE_BUFFER 
        , 
       null, 
       iError, 
       0x0804, 
       bb, buf.length, 
       //pMsgBuf, 0, 
       null 
      ); 
     //for (int i=0; i<iChar; i++) 
     //{ 
     // System.out.print (" "); 
     // System.out.print (String.format("%02X", buf[i]&0xFFFF)); 
     //} 
     bb.limit (iChar); 
     //System.out.print (bb); 
     //System.out.print (pMsgBuf.getValue().getString(0)); 
     //win32.LocalFree (pMsgBuf.getValue()); 
     return bb.toString(); 
    } 

    public static void main (String[] args) throws Exception 
    { 
     if (args.length == 0) 
     { 
      System.out.println ("获取 Windows 的文件时间(创建时间、最后修改时间、最后访问时间)"); 
      System.out.println ("用法:"); 
      System.out.println (" java -cp .;..;jna.jar;platform.jar WindowsFileTime [文件名1] [文件名2]..."); 
      return; 
     } 

     boolean rc; 
     java.sql.Timestamp ct = new java.sql.Timestamp(0); 
     java.sql.Timestamp wt = new java.sql.Timestamp(0); 
     java.sql.Timestamp at = new java.sql.Timestamp(0); 

     for (String sFileName : args) 
     { 
      System.out.println ("文件 " + sFileName); 

      rc = GetFileTime (sFileName, ct, wt, at); 
      if (rc) 
      { 
       System.out.println (" 创建时间:" + ct); 
       System.out.println (" 修改时间:" + wt); 
       System.out.println (" 访问时间:" + at); 
      } 
      else 
      { 
       //System.out.println ("GetFileTime 失败"); 
      } 


      //wt.setTime (System.currentTimeMillis()); 
      wt = java.sql.Timestamp.valueOf("2010-07-23 00:00:00"); 
      rc = SetFileTime (sFileName, null, wt, null); 
      if (rc) 
      { 
       System.out.println ("SetFileTime (最后修改时间) 成功"); 
      } 
      else 
      { 
       //System.out.println ("SetFileTime 失败"); 
      } 
     } 
    } 
} 
+0

M'a tellement aidé! Je vous remercie! –

2
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 


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

      // get runtime environment and execute child process 
      Runtime systemShell = Runtime.getRuntime(); 
      BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Enter filename: "); 
      String fname = (String) br1.readLine(); 
      Process output = systemShell.exec("cmd /c dir \"" + fname + "\" /tc"); 

      System.out.println(output); 
      // open reader to get output from process 
      BufferedReader br = new BufferedReader(new InputStreamReader(output.getInputStream())); 

      String out = ""; 
      String line = null; 

      int step = 1; 
      while ((line = br.readLine()) != null) { 
       if (step == 6) { 
        out = line; 
       } 
       step++; 
      } 

      // display process output 
      try { 
       out = out.replaceAll(" ", ""); 
       System.out.println("CreationDate: " + out.substring(0, 10)); 
       System.out.println("CreationTime: " + out.substring(10, 16) + "m"); 
      } catch (StringIndexOutOfBoundsException se) { 
       System.out.println("File not found"); 
      } 
     } catch (IOException ioe) { 
      System.err.println(ioe); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 
} 

/** 
D:\Foldername\Filename.Extension 

Ex: 
Enter Filename : 
D:\Kamal\Test.txt 
CreationDate: 02/14/2011 
CreationTime: 12:59Pm 

*/ 
2

La bibliothèque javaxt-core comprend une classe de fichier qui peut être utilisé pour récupérer les attributs de fichiers, y compris la temps de creation. Exemple:

javaxt.io.File file = new javaxt.io.File("/temp/file.txt"); 
System.out.println("Created: " + file.getCreationTime()); 
System.out.println("Accessed: " + file.getLastAccessTime()); 
System.out.println("Modified: " + file.getLastModifiedTime()); 

Fonctionne avec Java 1.5 et versions ultérieures.

21

Avec la sortie de Java 7, il est intégré façon de le faire:

Path path = Paths.get("path/to/file"); 
BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class); 
FileTime creationTime = attributes.creationTime(); 

Il est important de noter que fournissent pas tous les systèmes d'exploitation ces informations. Je crois dans ces cas que cela renvoie le temps qui est la dernière fois modifié.

Windows fournit le temps de création.

0

Ceci est un exemple de base en Java, en utilisant BasicFileAttributes classe:

Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt"); 
    BasicFileAttributes attr; 
    try { 
     attr = Files.readAttributes(path, BasicFileAttributes.class); 
     System.out.println("File creation time: " + attr.creationTime()); 
    } catch (IOException e) { 
     System.out.println("oops un error! " + e.getMessage()); 
    }