Déterminer la date de création du fichier en Java

il y a une autre question similaire à la mienne sur StackOverflow ( comment obtenir la date de création d'un fichier en Java ), mais la réponse n'est pas vraiment là car L'OP avait un besoin différent qui pourrait être résolu par d'autres mécanismes. J'essaie de créer une liste des fichiers dans un répertoire qui peut être triée par âge, d'où la nécessité de la date de création du fichier.

Je n'ai pas trouvé de bonne façon de le faire après beaucoup de chalutage de la toile. Est-il mécanisme pour obtenir des dates de création de fichiers?

BTW, actuellement sur un système Windows, peuvent travailler sur un système Linux. En outre, Je ne peux pas garantir qu'une convention de nommage de fichier serait suivie lorsque la date/heure de création est intégrée dans le nom.

83
demandé sur Community 2010-04-27 22:19:46

6 réponses

Java nio dispose d'options pour accéder à creationTime et autres méta-données tant que le système de fichiers le fournit. Vérifier ce lien out

par exemple (fourni sur la base du commentaire de @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());
127
répondu ring bearer 2014-11-20 14:11:41

comme suite à cette question-puisqu'elle se rapporte spécifiquement au temps de création et qu'elle traite de son obtention via les nouvelles classes nio - il semble qu'en ce moment même dans l'implémentation de JDK7 vous n'avez pas de chance. Addendum: même comportement dans OpenJDK7.

sur les systèmes de fichiers Unix vous ne pouvez pas récupérer l'horodatage de création, vous obtenez simplement une copie de la dernière heure de modification. C'est tellement triste, mais malheureusement vrai. Je ne sais pas pourquoi, mais le code le fait spécifiquement la suite va le montrer.

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);
    }
  }
}
12
répondu David Nugent 2013-01-22 09:56:37

j'ai résolu ce problème en utilisant JDK 7 avec ce code:

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));
        }
    }
}
12
répondu Oleksandr Tarasenko 2014-11-18 13:41:38

sur un système de Windows, vous pouvez utiliser gratuitement la bibliothèque FileTimes .

ce sera plus facile à l'avenir avec Java NIO.2 (JDK 7) et le java.nio.fichier.attribut paquet .

mais rappelez-vous que la plupart des systèmes de fichiers Linux ne supporte pas les horodatages de création de fichiers .

9
répondu Jacek S 2010-04-27 19:31:43

ceci est un exemple de base de la façon d'obtenir la date de création d'un fichier dans Java , en utilisant 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());
}
9
répondu Jorgesys 2016-11-04 15:55:50

L'API de java.io.File supporte uniquement l'obtention du dernier modifié time. Et l'Internet est très calme sur ce sujet.

sauf si j'ai manqué quelque chose d'important, la bibliothèque Java telle quelle (Jusqu'à Java 7, mais pas encore incluse) n'inclut pas cette capacité. Donc si vous étiez désespéré pour cela, une solution serait d'écrire du code C(++) pour appeler les routines du système et l'appeler en utilisant JNI. La plupart de ce travail semble déjà fait pour vous dans une bibliothèque appelée JNA , cependant.

vous pourriez encore avoir besoin de faire un peu de codage spécifique à L'OS en Java pour cela, bien que, comme vous ne trouverez probablement pas les mêmes appels système disponibles dans Windows et Unix / Linux / BSD / OS X.

7
répondu Carl Smotricz 2010-04-27 18:29:47