2010-04-27 25 views
76

Es gibt eine andere ähnliche Frage auf Stackoverflow (How to get creation date of a file in Java) ich, aber die Antwort ist nicht wirklich da, wie die OP ein anderes Bedürfnis hatte, die über andere Mechanismen gelöst werden könnte. Ich versuche, eine Liste der Dateien in einem Verzeichnis zu erstellen, das nach Alter sortiert werden kann, daher das Datum der Dateierstellung.Dateierstellungsdatum ermittelt in Java

Ich habe keine gute Möglichkeit, dies nach viel Schleppnetzfischerei zu tun. Gibt es einen Mechanismus, um Dateierstellungsdaten zu erhalten?

BTW, derzeit auf einem Windows-System, muss dies möglicherweise auch auf einem Linux-System arbeiten. Außerdem kann ich nicht garantieren, dass eine Dateibenennungskonvention befolgt wird, wenn das Erstellungsdatum/die Erstellungszeit in den Namen eingebettet ist.

+2

Okay, nach weiteren Diskussionen und Untersuchungen zu den Dateisystemen haben wir entschieden, dass die Verwendung von last modified ausreichend ist, da es wahrscheinlich zusammen mit dem Erstellungsdatum überprüft werden müsste. Beide müssen überprüft werden, um festzustellen, ob eine alte Datei kürzlich geändert wurde und daher noch aktiv ist. Also, einfach nach der am weitesten modifizierten Datei suchen. Danke für alle Eingaben. Übrigens würde ich gerne nio verwenden, aber die Linux-Variante unterstützt die Erstellung von Dateien sowieso nicht. – Todd

Antwort

5

Die API von java.io.File unterstützt nur die letzte geändert Zeit. Und auch zu diesem Thema ist das Internet sehr leise.

Wenn ich nicht etwas Wesentliches verpasst habe, enthält die Java-Bibliothek (bis einschließlich, aber noch nicht Java 7) diese Fähigkeit nicht. Wenn Sie also verzweifelt danach suchen, wäre eine Lösung, C (++) -Code zu schreiben, um Systemroutinen aufzurufen und sie mit JNI aufzurufen. Die meisten dieser Arbeiten scheinen in einer Bibliothek namens JNA für Sie bereits erledigt zu sein.

Sie können immer noch brauchen für diese ein wenig betriebssystemspezifische Codierung in Java zu tun, obwohl, wie Sie wahrscheinlich nicht das gleiche System finden ruft in Windows und Unix/Linux/BSD/OS X.

+2

Ja, Java 7 wäre großartig, denn das nio scheint dies in grundlegenden Attributen zu haben. Ich hätte nie gedacht, dass ich mich beschweren würde, zu früh geboren zu sein! ;) – Todd

+6

Der Grund, warum die 'File'-Klasse diese Fähigkeit nicht besitzt, besteht darin, dass die meisten Dateisysteme diese Informationen nicht einmal verfolgen. Und diejenigen, die sich nicht immer einig sind, wann sie aktualisiert werden sollten. – Syntactic

+0

@ syntaktisch, sehr guter Punkt. –

113

Java nio verfügt über Optionen, um auf creationTime und andere Metadaten zuzugreifen, solange das Dateisystem es bereitstellt. prüft this link out

Zum Beispiel (Gestellt basierend auf @ ydaetskcoR Kommentar):

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

Sieht so aus, als ob man gehen könnte –

+13

Das wäre das Beste, aber es ist Java 7. Wir verwenden immer noch 6, aber ich werde unsere Upgrade-Optionen untersuchen. – Todd

+1

Fantastisch. Genau das habe ich gebraucht. – RestInPeace

9

Auf einem Windows-System, können Sie kostenlos FileTimes Bibliothek verwenden.

Dies wird in Zukunft mit Java NIO.2 (JDK 7) and the java.nio.file.attribute package einfacher sein.

Aber denken Sie daran, dass die meisten Linux-Dateisysteme don't support file creation timestamps.

+0

Anders herum für Linux-Maschinen, die unterstützt die erstellte Zeit nicht? – Maverick

+0

Verwenden Sie einfach ein Dateisystem, das Zeitstempel für die Dateierstellung unterstützt. Der verlinkte Wikipedia-Artikel schlägt ext4 vor, was jetzt ziemlich üblich ist. – davtom

12

Als Follow-up auf diese Frage - da es speziell auf die Erstellungszeit bezieht und diskutiert sie über die neuen nio Klassen zu erhalten - es jetzt in JDK7 Implementierung scheint, dass Sie kein Glück. Nachtrag: Das gleiche Verhalten ist in OpenJDK7.

Auf Unix-Dateisystemen können Sie den Erstellungszeitstempel nicht abrufen, Sie erhalten einfach eine Kopie der letzten Änderungszeit. So traurig, aber leider wahr. Ich bin mir nicht sicher, warum das ist, aber der Code tut dies speziell, wie das Folgende zeigen wird.

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

Wissen Sie, wie man es für Android macht? BasicFileAttributes ist dort nicht als API verfügbar ... –

10

Ich habe dieses Problem mit JDK 7 mit diesem Code gelöst:

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

Dies ist ein einfaches Beispiel dafür, wie das Erstellungsdatum einer Datei in Java zu bekommen, mit BasicFileAttributes Klasse:

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

für Windows-System Sie this Tutorial ausprobieren können, schlägt es eine Abhilfe für Java-Versionen vor Java 7 ....

Verwandte Themen