Determina la data di creazione del file in Java

C’è un’altra domanda simile a mia su StackOverflow ( Come ottenere la data di creazione di un file in Java ), ma la risposta non è realmente lì poiché l’OP aveva un bisogno diverso che poteva essere risolto tramite altri meccanismi. Sto cercando di creare un elenco dei file in una directory che può essere ordinata per età, quindi la necessità della data di creazione del file.

Non ho trovato nessun buon modo per farlo dopo una lunga trawling del web. C’è un meccanismo per ottenere le date di creazione del file?

BTW, attualmente su un sistema Windows, potrebbe aver bisogno di questo per funzionare anche su un sistema Linux. Inoltre, non posso garantire che una convenzione di denominazione dei file venga seguita dove la data / ora di creazione è incorporata nel nome.

Java nio ha opzioni per accedere a creationTime e ad altri meta-dati finché il filesystem lo fornisce. Controlla questo link

Ad esempio (Fornito in base al commento di @ 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()); 

Come seguito a questa domanda – dal momento che si riferisce specificamente al tempo di creazione e discute di ottenerlo attraverso le nuove classi di nio – sembra che in questo momento nell’implementazione di JDK7 sei sfortunato. Addendum: lo stesso comportamento è in OpenJDK7.

Sui filesystem Unix non è ansible recuperare il timestamp della creazione, è sufficiente ottenere una copia dell’ultima ora di modifica. Così triste, ma purtroppo vero. Non sono sicuro del perché, ma il codice lo fa specificamente come dimostrerà il seguente.

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

Ho risolto questo problema usando JDK 7 con questo codice:

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

Su un sistema Windows, è ansible utilizzare la libreria FileTimes gratuita.

Questo sarà più facile in futuro con Java NIO.2 (JDK 7) e il pacchetto java.nio.file.attribute .

Ma ricorda che la maggior parte dei filesystem Linux non supporta i timestamp di creazione di file .

Questo è un esempio di base su come ottenere la data di creazione di un file in Java , usando la class 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()); } 

L’API di java.io.File supporta solo il java.io.File dell’ultima ora modificata . E Internet è molto tranquillo anche su questo argomento.

A meno che non mi sia sfuggito qualcosa di significativo, la libreria Java così com’è (fino a ma non ancora incluso Java 7) non include questa funzionalità. Quindi, se fossi disperata per questo, una soluzione sarebbe scrivere un codice C (++) per chiamare le routine di sistema e chiamarlo usando JNI. Gran parte di questo lavoro sembra essere già stato fatto per te in una libreria chiamata JNA , però.

Potrebbe comunque essere necessario eseguire una piccola codifica specifica del sistema operativo in Java per questo, poiché probabilmente non si troveranno le stesse chiamate di sistema disponibili in Windows e Unix / Linux / BSD / OS X.