2010-04-27 24 views
76

Hay otra pregunta similar a la mía en StackOverflow (How to get creation date of a file in 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.Determine la fecha de creación del archivo en Java

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?

BTW, actualmente en un sistema 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.

+2

Bien, después de más discusiones e investigaciones sobre los sistemas de archivos, hemos decidido que usar la última modificación es suficiente, ya que probablemente habría sido revisado junto con la fecha de creación. Ambos deberían verificarse para determinar si un archivo antiguo se modificó recientemente y, por lo tanto, aún está activo. Por lo tanto, solo verifique el archivo modificado más lejano en el pasado. Gracias por toda la entrada. Por cierto, me encantaría usar nio, pero el sabor de Linux aquí no admite la creación de archivos de todos modos. – Todd

Respuesta

5

La API de java.io.File solo admite la obtención del último modificado tiempo. 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 todavía 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. La mayor parte de este trabajo parece que ya está hecho para ti en una biblioteca llamada JNA.

Es posible que aún tenga que hacer un poco de codificación específica del sistema operativo en Java para esto, sin embargo, ya que probablemente no encontrará el mismo sistema de llamadas disponible en Windows y Unix/Linux/BSD/OS X.

+2

Sí, Java 7 sería genial ya que el nio parece tener esto en atributos básicos. ¡Nunca pensé que me quejaría de haber nacido demasiado temprano! ;) – Todd

+6

La razón por la cual la clase 'File' no tiene esta capacidad es que la mayoría de los sistemas de archivos ni siquiera rastrean esta información. Y aquellos que sí no siempre están de acuerdo sobre cuándo debería actualizarse. – Syntactic

+0

@syntactic, muy buen punto. –

113

Java nio tiene opciones para acceder a creationTime y otros metadatos, siempre que el sistema de archivos lo proporcione. Comprobar this link cabo

Por ejemplo (con la condición basa 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()); 
+1

Parece que hay que ir –

+13

Esto sería lo mejor, pero es Java 7. Todavía estamos usando 6, pero investigaré nuestras opciones de actualización. – Todd

+1

Fantástico. Exactamente lo necesitaba – RestInPeace

9

En un sistema Windows, se puede utilizar de FileTimes biblioteca.

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

Pero recuerde que la mayoría de los sistemas de archivos Linux don't support file creation timestamps.

+0

Cualquier otra forma para máquinas Linux que no es compatible con el tiempo creado? – Maverick

+0

Simplemente use un sistema de archivos que admita las marcas de tiempo de creación de archivos. El artículo de Wikipedia vinculado sugiere ext4, que es bastante común ahora. – davtom

12

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 nio, parece que ahora en la implementación de JDK7 no tiene suerte. Adición: el mismo comportamiento está en OpenJDK7.

En 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); 
    } 
    } 
} 
+0

¿Sabes cómo hacerlo para Android? BasicFileAttributes no está disponible como API incorporada allí ... –

10

He resuelto este problema utilizando 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)); 
     } 
    } 
} 
8

Este es un ejemplo básico de cómo obtener la fecha de creación de un archivo en Java, utilizando BasicFileAttributes clase:

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

para el sistema de Windows puede intentar this tutorial, se sugiere una solución para las versiones de Java antes de Java 7 ....

Cuestiones relacionadas