2010-04-27 14 views
76

C'è un'altra domanda simile a quella su StackOverflow (How to get creation date of a 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.Determinare la data di creazione del file in Java

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.

+2

Ok, dopo ulteriori discussioni e approfondimenti sui filesystem, abbiamo deciso che l'uso dell'ultima modifica è sufficiente poiché probabilmente sarebbe stato controllato insieme alla data di creazione. Entrambi dovrebbero essere controllati per determinare se un vecchio file è stato modificato di recente e quindi ancora attivo. Quindi, controlla il file modificato più lontano in passato. Grazie per tutti gli input. A proposito, mi piacerebbe usare nio, ma l'aroma di Linux qui non supporta comunque la creazione di file. – Todd

risposta

5

L'API di java.io.File supporta solo il recupero dell'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ò.

Si può ancora bisogno di fare un po 'di codifica specifica del sistema operativo in Java per questo, però, come avrete probabilmente non trovare lo stesso sistema di chiamate disponibili in Windows e Unix/Linux/BSD/OS X.

+2

Sì, Java 7 sarebbe fantastico visto che il nio sembra avere questo in attributi di base. Non avrei mai pensato di lamentarmi di essere nato troppo presto! ;) – Todd

+6

Il motivo per cui la classe 'File' non ha questa capacità è che la maggior parte dei file system non traccia nemmeno queste informazioni. E quelli che lo fanno non sono sempre d'accordo su quando dovrebbe essere aggiornato. – Syntactic

+0

@sintattico, ottimo punto. –

113

Java nio dispone di opzioni per accedere a creationTime e altri metadati purché il filesystem lo fornisca. check out this link

Per esempio (fornito basa su @ 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()); 
+1

Sembra la strada da percorrere –

+13

Questo sarebbe il migliore, ma è Java 7. Stiamo ancora utilizzando 6, ma esaminerò le nostre opzioni di aggiornamento. – Todd

+1

Fantastico. Esattamente ciò di cui avevo bisogno. – RestInPeace

9

Su un sistema Windows, è possibile utilizzare gratuitamente FileTimes biblioteca.

Questo sarà più facile in futuro con Java NIO.2 (JDK 7) and the java.nio.file.attribute package.

Ma ricorda che la maggior parte dei filesystem di Linux don't support file creation timestamps.

+0

Qualsiasi altro modo per le macchine Linux che non supporta il tempo creato? – Maverick

+0

Basta usare un file system che supporti i timestamp di creazione di file. L'articolo di Wikipedia collegato suggerisce ext4, che è abbastanza comune ora. – davtom

12

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 proprio nell'implementazione di JDK7 tu sia sfortunato. Addendum: lo stesso comportamento è in OpenJDK7.

Sui filesystem Unix non è possibile recuperare il timestamp di 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); 
    } 
    } 
} 
+0

Sai come farlo per Android? BasicFileAttributes non è disponibile come API integrata lì ... –

10

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

Questo è un esempio di base di come ottenere la data di creazione di un file in Java, utilizzando BasicFileAttributes classe:

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

per il sistema di Windows si può provare this tutorial, si suggerisce una soluzione per le versioni di Java prima di Java 7 ....

Problemi correlati