Determinar la fecha de creación del archivo en Java

Hay otra pregunta similar a la mía en StackOverflow ( Cómo obtener la fecha de creación de un archivo en Java ), pero la respuesta no está realmente allí ya que el OP tenía una necesidad diferente que podría resolverse a través de otros mecanismos. Estoy tratando de crear una lista de los archivos en un directorio que se puede ordenar por edad, de ahí la necesidad de la fecha de creación del archivo.

No he encontrado ninguna buena manera de hacer esto después de mucho arrastre de la web. ¿Hay algún mecanismo para obtener fechas de creación de archivos?

Por cierto, actualmente en un sistema de Windows, puede necesitar esto para trabajar en un sistema Linux también. Además, no puedo garantizar que se siga una convención de nomenclatura de archivos cuando la fecha / hora de creación esté incrustada en el nombre.

Java nio tiene opciones para acceder a creationTime y otros metadatos, siempre que el sistema de archivos lo proporcione. Verifique este enlace

Por ejemplo (Siempre basado en el comentario de @ 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()); 

Como seguimiento de esta pregunta, ya que se relaciona específicamente con el tiempo de creación y se analiza la obtención a través de las nuevas clases de nio, parece que ahora en la implementación de JDK7 no tiene suerte. Adición: el mismo comportamiento está en OpenJDK7.

En los sistemas de archivos Unix no puede recuperar la marca de tiempo de creación, simplemente obtiene una copia de la hora de la última modificación. Muy triste, pero lamentablemente cierto. No estoy seguro de por qué es así, pero el código específicamente hace eso, como lo demostrará a continuación.

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

He resuelto este problema usando JDK 7 con este código:

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

En un sistema Windows, puede usar la biblioteca gratuita FileTimes .

Esto será más fácil en el futuro con Java NIO.2 (JDK 7) y el paquete java.nio.file.attribute .

Pero recuerde que la mayoría de los sistemas de archivos Linux no son compatibles con las marcas de tiempo de creación de archivos .

Este es un ejemplo básico de cómo obtener la fecha de creación de un archivo 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("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()); } 

La API de java.io.File solo admite obtener la última hora modificada . Y Internet también es muy silencioso con respecto a este tema.

A menos que haya omitido algo significativo, la biblioteca Java tal como está (hasta pero aún no incluye Java 7) no incluye esta capacidad. Entonces, si estuviera desesperado por esto, una solución sería escribir un código C (++) para llamar a las rutinas del sistema y llamarlo usando JNI. Sin embargo, la mayor parte de este trabajo parece haber sido hecho para ti en una biblioteca llamada JNA .

Sin embargo, es posible que aún necesite hacer una pequeña encoding específica del sistema operativo en Java, ya que probablemente no encontrará las mismas llamadas al sistema disponibles en Windows y Unix / Linux / BSD / OS X.