it-swarm.com.de

Bestimmen Sie das Erstellungsdatum der Datei in Java

Es gibt eine weitere ähnliche Frage zu StackOverflow ( Wie erhalte ich das Erstellungsdatum einer Datei in Java? ), aber die Antwort ist nicht wirklich da, da das OP einen anderen Bedarf hatte, der über einen anderen gelöst werden könnte Mechanismen. Ich versuche, eine Liste der Dateien in einem Verzeichnis zu erstellen, die nach Alter sortiert werden kann, daher das Erstellungsdatum der Datei.

Ich habe nach langem Durchforsten des Webs keinen guten Weg gefunden, dies zu tun. Gibt es einen Mechanismus zum Abrufen von Daten für die Dateierstellung?

BTW, derzeit auf einem Windows-System, benötigt dies möglicherweise auch, um auf einem Linux-System zu funktionieren. Außerdem kann ich nicht garantieren, dass eine Dateinamenskonvention befolgt wird, bei der das Erstellungsdatum und die Erstellungszeit im Namen enthalten sind.

95
Todd

Java nio bietet Optionen für den Zugriff auf creationTime und andere Metadaten, sofern das Dateisystem dies bereitstellt. Check dieser Link out

Zum Beispiel (Bereitgestellt basierend auf dem Kommentar von @ 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());
151
ring bearer

Ich habe dieses Problem mit JDK 7 mit folgendem 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));
        }
    }
}
13

Zur Beantwortung dieser Frage - da sie sich speziell auf die Erstellungszeit bezieht und deren Erlangung über die neuen nio-Klassen bespricht - scheint es, dass Sie in der Implementierung von JDK7 derzeit kein Glück haben. Nachtrag: dasselbe Verhalten ist in OpenJDK7.

Auf Unix-Dateisystemen können Sie den Erstellungszeitstempel nicht abrufen. Sie erhalten lediglich eine Kopie des letzten Änderungszeitpunkts. So traurig, aber leider wahr. Ich bin mir nicht sicher, warum das so ist, aber der Code macht das genau so, wie im Folgenden gezeigt 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);
    }
  }
}
13
David Nugent

Dies ist ein grundlegendes Beispiel für das Abrufen des Erstellungsdatums einer Datei in Java 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());
}
11
Jorgesys

Auf einem Windows-System können Sie die kostenlose Bibliothek FileTimes verwenden.

Dies wird in Zukunft mit Java NIO.2 (JDK 7) und dem Java.nio.file.attribute-Paket einfacher.

Beachten Sie jedoch, dass die meisten Linux-Dateisysteme Zeitstempel für die Dateierstellung werden nicht unterstützt .

9
Jacek S

Die API von Java.io.File unterstützt nur das Abrufen des letzten geänderten Zeitpunkts. Auch das Internet ist zu diesem Thema sehr leise.

Sofern ich nichts Wichtiges verpasst habe, enthält die Bibliothek Java wie sie ist (bis zu, aber noch nicht einschließlich Java 7)) diese Funktion nicht. Also, wenn Sie verzweifelt waren In diesem Fall besteht eine Lösung darin, C (++) -Code zu schreiben, um Systemroutinen aufzurufen und ihn mit JNI aufzurufen. Der größte Teil dieser Arbeit scheint bereits für Sie in einer Bibliothek mit dem Namen ERLEDIGT ZU SEIN. JNA .

Möglicherweise müssen Sie dafür noch ein wenig betriebssystemspezifisches Programmieren in Java) durchführen, da Sie wahrscheinlich nicht dieselben Systemaufrufe finden, die in Windows und Unix/Linux/BSD/OS X verfügbar sind .

9
Carl Smotricz

in Java1.7 + Mit diesem Code können Sie die Erstellungszeit für Dateien ermitteln!

private static LocalDateTime getCreateTime(File file) throws IOException {
        Path path = Paths.get(file.getPath());
        BasicFileAttributeView basicfile = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
        BasicFileAttributes attr = basicfile.readAttributes();
        long date = attr.creationTime().toMillis();
        Instant instant = Instant.ofEpochMilli(date);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }
1
zhangxinqiang