140 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.

206voto

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 .

20voto

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.

12voto

Carl Smotricz Points 36400

L'API de java.io.File ne permet d'obtenir que le dernier modifié temps. Et l'Internet est très silencieux sur ce sujet également.

À moins que je n'aie manqué quelque chose d'important, la bibliothèque Java telle qu'elle est (jusqu'à Java 7, mais pas encore) n'inclut pas cette capacité. Donc, si vous en aviez désespérément besoin, une solution serait d'écrire du code C(++) pour appeler des routines système et de l'appeler en utilisant JNI. La majeure partie de ce travail semble être déjà effectuée pour vous dans une bibliothèque appelée JNA mais

Il se peut toutefois que vous deviez effectuer un peu de codage spécifique au système d'exploitation en Java, car vous ne trouverez probablement pas les mêmes appels système disponibles dans Windows et Unix/Linux/BSD/OS X.

2 votes

Oui, Java 7 serait bien car le nio semble avoir cela dans ses attributs de base. Je n'aurais jamais cru que je me plaindrais d'être né trop tôt ;)

7 votes

La raison pour laquelle le File n'a pas cette capacité est que la plupart des systèmes de fichiers ne suivent même pas cette information. Et ceux qui le font ne sont pas toujours d'accord sur le moment où elle doit être mise à jour.

1 votes

@Syntactic : En fait la plupart des systèmes de fichiers enregistrent cette information . Les exceptions sont ext<=3 et Reiser. FAT, NTFS, HFS, ZFS et ext4 le supportent. Mais il a été lent à se propager à travers toutes les couches de Linux et les bibliothèques et commandes pour le rendre universellement utilisé.

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