¿Cómo descubrir el tiempo de creación de un archivo con Java?

¿Hay alguna manera fácil de descubrir el tiempo de creación de un archivo con Java? La clase File solo tiene un método para obtener la hora de “última modificación”. De acuerdo con algunos recursos que encontré en Google, la clase File no proporciona un método getCreationTime () porque no todos los sistemas de archivos admiten la idea de un tiempo de creación.

La única solución de trabajo que encontré implica invocar la línea de comando y ejecutar el comando “dir”, que parece que genera el tiempo de creación del archivo. Supongo que esto funciona, solo necesito dar soporte a Windows, pero parece muy propenso a errores.

¿Hay bibliotecas de terceros que proporcionan la información que necesito?

Actualización: Al final, no creo que valga la pena que compre la biblioteca de terceros, pero su API parece bastante buena, así que probablemente sea una buena opción para cualquier otra persona que tenga este problema.

Con el lanzamiento de Java 7 hay una forma incorporada de hacer esto:

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

Es importante tener en cuenta que no todos los sistemas operativos proporcionan esta información. Creo que en esas instancias, esto devuelve el mtime que es la última vez que se modifica.

Windows proporciona tiempo de creación.

Hace algunos días escribí una pequeña clase de prueba, ojalá pueda ayudarte:

 // 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 

He estado investigando esto por mí mismo, pero necesito algo que funcione en las plataformas Windows / * nix.

Una publicación de SO incluye algunos enlaces a implementaciones de JNI de Posix .

  • JNA-POSIX
  • POSIX para Java

En particular, JNA-POSIX implementa métodos para obtener estadísticas de archivos con implementaciones para Windows , BSD, Solaris, Linux y OSX.

En general, parece muy prometedor, así que lo probaré en mi propio proyecto muy pronto.

 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 */ 

La biblioteca javaxt-core incluye una clase File que se puede usar para recuperar atributos de archivos, incluida la hora de creación. Ejemplo:

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

Funciona con Java 1.5 y superior.

Me gusta la respuesta en jGuru que enumera la opción de usar JNI para obtener la respuesta. Esto podría ser más rápido que bombardear y puede encontrar otras situaciones como esta que deben implementarse específicamente para Windows.

Además, si alguna vez necesita un puerto a una plataforma diferente, entonces también puede portar su biblioteca y simplemente hacer que devuelva -1 para la respuesta a esta pregunta en * ix.

Este es un ejemplo básico en Java , utilizando la clase BasicFileAttributes :

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