web-dev-qa-db-fra.com

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

Il existe une autre question similaire à résoudre sur StackOverflow ( Comment obtenir la date de création d’un fichier en Java ), mais la réponse n’est pas réelle, le PO ayant un besoin différent pouvant être résolu par mécanismes. J'essaie de créer une liste des fichiers d'un répertoire pouvant être triés par âge, d'où la nécessité de la date de création du fichier.

Je n’ai trouvé aucun bon moyen de le faire après avoir passé beaucoup de temps sur le Web. Existe-t-il un mécanisme pour obtenir les dates de création de fichier?

BTW, actuellement sur un système Windows, peut également avoir besoin de cela pour fonctionner sur un système Linux. De plus, je ne peux pas garantir qu'une convention de dénomination de fichier serait suivie lorsque la date/heure de création est incorporée dans le nom.

95
Todd

Java nio a des options pour accéder à creationTime et à d'autres méta-données tant que le système de fichiers le fournit. Vérifiez 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());
151
ring bearer

J'ai résolu ce problème avec 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));
        }
    }
}
13

Pour faire suite à cette question - étant donné que cela concerne spécifiquement le temps de création et discute de son obtention via les nouvelles classes nio -, il semble que dans la mise en œuvre de JDK7, vous ne soyez pas chanceux. Addendum: le même comportement est 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. Si triste, mais malheureusement vrai. Je ne sais pas pourquoi, mais le code le fait précisément, comme le montre ce qui suit.

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

Voici un exemple de base sur la manière 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());
}
11
Jorgesys

Sur un système Windows, vous pouvez utiliser la bibliothèque libre FileTimes .

Ce sera plus facile à l'avenir avec Java NIO.2 (JDK 7) et le package Java.nio.file.attribute .

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

9
Jacek S

L'API de Java.io.File ne prend en charge que l’obtention de la dernière modification . Et Internet est très silencieux sur ce sujet également.

Sauf si j'ai manqué quelque chose d'important, la bibliothèque Java en l'état (jusqu'à, mais pas encore l'inclusion = Java 7) n'inclut pas cette possibilité.) pour cela, une solution consisterait à écrire du code C (++) pour appeler des routines système et à l’appeler à l’aide de JNI. La plupart de ce travail semble déjà avoir été effectué dans une bibliothèque appelée JNA , cependant.

Vous devrez peut-être encore faire un peu de codage spécifique à votre système sous Java pour cela, car vous ne trouverez probablement pas les mêmes appels système disponibles sous Windows et Unix/Linux/BSD/OS X .

9
Carl Smotricz

dans Java1.7 + Vous pouvez utiliser ce code pour obtenir le temps de création du fichier!

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