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 ahí, 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 rastrear la web. ¿Existe un mecanismo para obtener las fechas de creación de archivos?
Por cierto, actualmente en un sistema Windows, puede necesitar esto para que funcione también en un sistema Linux. Además, no puedo garantizar que se siga una convención de nomenclatura de archivos donde la fecha / hora de creación esté incrustada en el nombre.
fuente
Respuestas:
Java nio tiene opciones para acceder a creationTime y otros metadatos siempre que el sistema de archivos lo proporcione. Compruebe este enlace a cabo
Por ejemplo (proporcionado según el comentario de @ ydaetskcoR):
fuente
readAttributes(file.toPath(), BasicFileAttributes.class)
demás que obtenga:no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))
statx
syscall se agregó en la versión más reciente del kernel de Linux.Resolví este problema usando JDK 7 con este código:
fuente
Como seguimiento a esta pregunta, ya que se relaciona específicamente con el tiempo de creación y analiza cómo obtenerlo a través de las nuevas clases nio, parece que en este momento en la implementación de JDK7 no tiene suerte. Anexo: 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 última hora de modificación. Muy triste, pero lamentablemente cierto. No estoy seguro de por qué es eso, pero el código lo hace específicamente como lo demostrará a continuación.
fuente
stat
no funciona. A menos que ejecute un kernel superior a 4.11 con glibc superior a 2.28 y coreutils superior a 8.31, entoncesstat
informará el nacimiento del archivo. Consulte la respuesta relacionada unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… Actualmente, el JDK no usa statx syscal.Este es un ejemplo básico de cómo obtener la fecha de creación de un archivo
Java
, usandoBasicFileAttributes
class:fuente
La API de
java.io.File
solo admite obtener la última hora modificada . E Internet también es muy silencioso sobre este tema.A menos que me haya perdido algo importante, la biblioteca de Java tal como está (hasta Java 7, pero sin incluirla) 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, parece que la mayor parte de este trabajo ya está hecho en una biblioteca llamada JNA .
Sin embargo, es posible que deba realizar una pequeña codificación específica del sistema operativo en Java para esto, ya que probablemente no encontrará las mismas llamadas al sistema disponibles en Windows y Unix / Linux / BSD / OS X.
fuente
File
clase no tiene esta capacidad es que la mayoría de los sistemas de archivos ni siquiera rastrean esta información. Y aquellos que lo hacen no siempre están de acuerdo en cuándo debería actualizarse.touch
para cambiar el tiempo de modulación y luego verificando nuevamente.En un sistema Windows, puede usar la biblioteca FileTimes gratuita .
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 de Linux no admiten las marcas de tiempo de creación de archivos .
fuente
en java1.7 + ¡Puedes usar este código para obtener el tiempo de creación del archivo!
fuente
Instant.ofEpochMilli(date)
? Gracias