10
votes

Comment obtenir la date de création de fichier sous Linux?

Je travaille avec des lots de fichiers contenant des informations sur le même objet aux différents moments de sa vie, et le seul moyen de les commander est par date de création. J'utilisais ceci: xxx

mais cela ne semble pas fonctionner. Qu'est-ce que je fais mal? Y a-t-il d'autres moyens plus fiables / simples pour obtenir la date de création de fichier sous Linux?


4 commentaires

Fstat ne récupère pas une valeur d'horodatage "Fichier créé" car de nombreux systèmes de fichiers ne suivent pas ces données. Avec quel système de fichiers travaillez-vous?


Celui qui est standard pour le dernier bureau Ubuntu, je suppose - je gère mon code sur la machine virtuelle (VMware Player, pour être exact) et laissé tous les détails tels que FileSystem à Ubuntu Installer.


Essayez stat (tampon et buf) au lieu de la non-utile - ici fopen


Si ce code compilait sans avertissements, vous avez un problème majeur avec votre compilateur. Si ce code compilait avec des avertissements, apprenez à payer des avertissements à des avertissements sur des types d'arguments incorrects (ou des conversions entier sur les entiers) et corrigez le code afin qu'il compile sans avertissements.


4 Réponses :


6
votes

Le temps de création de fichier n'est pas stocké nulle part, vous ne pouvez récupérer que l'une des opérations suivantes: xxx

Votre code devrait toutefois vous donner la dernière fois la dernière modification. Remarque: vous pouvez utiliser stat () au lieu de fstat () sans ouvrir le fichier ( stat () prend le nom de fichier comme param).


1 commentaires

Bah, j'ai négligé que vous passez le pointeur de fichier à Fstat, au lieu du descripteur :)



14
votes

L'approximation la plus proche de "Date de création" est le membre st_ctime dans l'état struct , mais qui enregistre réellement la dernière fois que l'inode a changé. Si vous créez le fichier et que vous ne modifiez jamais sa taille ou ses autorisations, cela fonctionne comme une durée de création. Sinon, il n'y a pas d'enregistrement lorsque le fichier a été créé, au moins dans les systèmes UNIX standard.

à vos fonctions, trier par st_mtime ... ou obtenez les fichiers nommés avec un horodatage dans la Nom.


Notez que si vous êtes sur Darwin (Mac OS X), le temps de création est disponible. De la page man STAT (2) :

Toutefois, lorsque le macro _darwin_freatu_64_bit_inode est défini, la structure STAT sera maintenant définie comme suit: xxx

notez le champ st_birthtimepec . Remarque aussi, que tous les temps sont dans struct Timespec , il existe donc une sous-seconde synchronisation ( TV_NSEC donne une résolution nanoseconde). POSIX 2008 nécessite le struct Timespec TIME TIME TIME SUR LES TEMPS STANDARDES; Darwin suit cela.


1 commentaires

Malheureusement, les fichiers sont créés par une autre application. Malheureusement, je n'ai aucune autorisation de changer quoi que ce soit.



9
votes

FSTAT fonctionne sur des descripteurs de fichier, pas des structures de fichier. La version la plus simple:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

#ifdef HAVE_ST_BIRTHTIME
#define birthtime(x) x.st_birthtime
#else
#define birthtime(x) x.st_ctime
#endif

int main(int argc, char *argv[])
{
        struct stat st;
        size_t i;

        for( i=1; i<argc; i++ )
        {
                if( stat(argv[i], &st) != 0 )
                        perror(argv[i]);
                printf("%i\n", birthtime(st));
        }

        return 0;
}


3 commentaires

Comment obtenir un descripteur de fichier, alors?


@ srv19 Vous pouvez obtenir le descripteur de fichier à l'aide d'Ouvrir (2) ou à l'aide de Fileno (TF). Ce que je vous ai donné, c'est un moyen d'inspecter ses attributs sans avoir à ouvrir le fichier. Si vous avez besoin d'ouvrir le fichier de toute façon et souhaitez utiliser les fonctions STDIO, Fileno est votre ami.


Votre solution s'est éliminée de mon problème. Merci beaucoup. J'ai soupçonné que j'étais missionnaire quelque chose dans l'usage de Fstat.



6
votes

Pour obtenir la date de création de fichier sous Linux, j'utilise la méthode suivante

root@sathishkumar# cat << _eof > test.txt 
> Hello
> This is my test file
> _eof
root@sathishkumar# cat test.txt 
Hello
This is my test file
root@sathishkumar# ls -i test.txt 
2097517 test.txt
root@sathishkumar# debugfs -R 'stat <2097517>' /dev/sda5

Inode: 2097517   Type: regular    Mode:  0664   Flags: 0x80000
Generation: 4245143992    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 27
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x50ea6d84:4826cc94 -- Mon Jan  7 12:09:00 2013
 atime: 0x50ea6d8e:75ed8a04 -- Mon Jan  7 12:09:10 2013
 mtime: 0x50ea6d84:4826cc94 -- Mon Jan  7 12:09:00 2013
 crtime: 0x5056d493:bbabf49c -- Mon Sep 17 13:13:15 2012
Size of extra inode fields: 28
EXTENTS:
(0):8421789


1 commentaires

Merci pour votre réponse, mais je dois noter que ma question portait sur l'utilisation de fonctions Linux Core C, et non sur la manière d'obtenir du temps de création dans Shell.