131 votes

Déterminer la date de création d'un fichier en Java

Il existe 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à puisque le PO avait un besoin différent qui pouvait ê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ù le besoin de la date de création du fichier.

Après avoir parcouru le web, je n'ai pas trouvé de moyen efficace de le faire. Existe-t-il un mécanisme permettant d'obtenir les dates de création des fichiers ?

BTW, actuellement sur un système Windows, peut avoir besoin que cela fonctionne sur un système Linux aussi bien. De plus, je ne peux pas garantir le respect d'une convention de dénomination des fichiers où la date et l'heure de création sont intégrées au nom.

2 votes

Bon, après plus de discussions et d'enquêtes sur les systèmes de fichiers, nous avons décidé que l'utilisation de la date de dernière modification est suffisante car elle aurait probablement dû être vérifiée avec la date de création. Les deux doivent être vérifiées pour déterminer si un ancien fichier a été récemment modifié et donc toujours actif. Il suffit donc de vérifier le fichier modifié le plus loin dans le passé. Merci pour toutes ces informations. BTW, j'aimerais bien utiliser nio, mais la version Linux ici ne supporte pas la création de fichiers de toute façon.

194voto

ring bearer Points 8369

Java nio a des options d'accès creationTime et d'autres méta-données tant que le système de fichiers les fournit. Consultez ce lien out

Par exemple (fourni sur la base de @ydaetskcoR ) :

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

16 votes

Ce serait le mieux, mais il s'agit de Java 7. Nous utilisons toujours la version 6, mais je vais étudier nos possibilités de mise à niveau.

8 votes

Utiliser readAttributes(file.toPath(), BasicFileAttributes.class) sinon vous obtenez : no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))

1 votes

@Hooli Pas de soucis, mon pote ! Essayez ceci logicbig.com/how-to/java/file-creation-date.html .

17voto

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

15voto

David Nugent Points 61

Pour faire suite à cette question - puisqu'elle concerne spécifiquement le temps de création et qu'il est question de l'obtenir via les nouvelles classes nio - il semble qu'actuellement, 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 l'heure de dernière modification. C'est triste, mais malheureusement vrai. Je ne suis pas sûr de savoir pourquoi, mais le code fait spécifiquement cela, comme le dé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);
    }
  }
}

1 votes

Savez-vous comment le faire pour Android ? BasicFileAttributes n'est pas disponible en tant qu'API intégrée...

0 votes

C'est en effet vrai, même un appel à stat ne fonctionne pas. À moins que vous n'utilisiez un noyau supérieur à 4.11 avec une glibc supérieure à 2.28 et des coreutils supérieurs à 8.31, alors stat rendra compte de la naissance du fichier. Voir la réponse associée unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/ Actuellement le JDK n'utilise pas statx syscal.

12voto

Elenasys Points 23268

Voici un exemple basique de comment obtenir la date de création d'un fichier en 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());
}

0 votes

Les personnes souhaitant utiliser cette classe doivent savoir qu'elle a commencé à être livrée dans Java 1.7.

10voto

Jacek S Points 379

Sur un système Windows, vous pouvez utiliser le logiciel gratuit FileTimes bibliothèque.

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

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

0 votes

Y a-t-il une autre solution pour les machines linux qui ne supportent pas le temps créé ?

0 votes

Utilisez simplement un système de fichiers qui prend en charge les horodatages de création de fichiers. L'article de Wikipedia suggère ext4 qui est assez courant maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X