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: 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? P> P>
4 Réponses :
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: Votre code devrait toutefois vous donner la dernière fois la dernière modification. Remarque: vous pouvez utiliser stat () code> au lieu de fstat () code> sans ouvrir le fichier ( stat () code> prend le nom de fichier comme param). p> p>
Bah, j'ai négligé que vous passez le pointeur de fichier à Fstat, au lieu du descripteur :)
L'approximation la plus proche de "Date de création" est le membre à vos fonctions, trier par Notez que si vous êtes sur Darwin (Mac OS X), le temps de création est disponible. De la page man Toutefois, lorsque le macro notez le champ st_ctime code> dans l'état struct code>, 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. st_mtime code> ... ou obtenez les fichiers nommés avec un horodatage dans la Nom. P>
STAT (2) CODE>: P>
_darwin_freatu_64_bit_inode code> est défini, la structure STAT sera maintenant définie comme suit: p>
blockQuote> st_birthtimepec code>. Remarque aussi, que tous les temps sont dans struct Timespec CODE>, il existe donc une sous-seconde synchronisation ( TV_NSEC code> donne une résolution nanoseconde). POSIX 2008 nécessite le struct Timespec CODE> TIME TIME TIME SUR LES TEMPS STANDARDES; Darwin suit cela. P> P>
Malheureusement, les fichiers sont créés par une autre application. Malheureusement, je n'ai aucune autorisation de changer quoi que ce soit.
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;
}
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.
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
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.
Fstat CODE> 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) code> au lieu de la non-utile - icifopen code>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.