2011-05-08 31 views
7

estoy trabajando con lotes de archivos que contienen información sobre el mismo objeto en los diferentes momentos de su vida, y la única manera de ordenar ellos es por fecha de creación. que estaba usando esto:¿Cómo obtener la fecha de creación del archivo en Linux?

//char* buffer has the name of file 
struct stat buf; 
FILE *tf; 
tf = fopen(buffer,"r"); 
//check handle 
fstat(tf, &buf); 
fclose(tf); 
pMyObj->lastchanged=buf.st_mtime; 

Pero eso no parece funcionar. ¿Qué estoy haciendo mal? ¿Hay otras maneras más confiables/simples de obtener la fecha de creación del archivo en Linux?

+3

'fstat' no obtiene un valor de marca de tiempo "archivo creado" porque muchos sistemas de ficheros don' t rastrea esos datos. ¿Con qué sistema de archivos estás trabajando? –

+0

Uno que es estándar para el último escritorio de Ubuntu, supongo - estoy ejecutando mi código en la máquina virtual (reproductor vmware, para ser exactos), y dejé todos los detalles como el sistema de archivos al instalador ubuntu. – Srv19

+0

intente 'stat (buffer, & buf)' en lugar de no-useful-here 'fopen' – mpez0

Respuesta

7

fstat trabaja en descriptores de archivo, archivo no estructuras. La versión más 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; 
} 

Tendrá que averiguar si el sistema ha st_birthtime en su estructura estadística mediante la inspección de sys/stat.h o el uso de algún tipo de construcción autoconf.

+0

¿Cómo obtengo el descriptor de archivo, entonces? – Srv19

+1

@ srv19 Puede obtener el descriptor del archivo usando open (2) o usando fileno (tf). Sin embargo, lo que le he dado es una forma de inspeccionar sus atributos sin tener que abrir el archivo. Si necesita abrir el archivo de todos modos y desea usar las funciones de stdio, fileno es su amigo. – Mel

+0

Tu solución eliminó mi problema. Muchas gracias. Sospeché que era misión algo en el uso de fstat. – Srv19

5

hora de creación del archivo no se almacena, sólo se puede recuperar una de las siguientes:

time_t st_atime; /* time of last access */ 
time_t st_mtime; /* time of last modification */ 
time_t st_ctime; /* time of last status change */ 

Su código debe darle la última fecha de modificación, sin embargo. Nota: se puede utilizar en lugar de stat()fstat() sin abrir el archivo (stat() toma el nombre de archivo como parámetro).

+0

Bah, pasé por alto que está pasando un puntero ARCHIVO a fstat, en lugar del descriptor :) –

10

La aproximación más aproximada a 'fecha de creación' es st_ctime miembro en el struct stat, pero eso realmente registra la última vez que cambió el inodo. Si crea el archivo y nunca modifica su tamaño o permisos, eso funciona como una hora de creación. De lo contrario, no hay registro de cuándo se creó el archivo, al menos en los sistemas Unix estándar.

para sus propósitos, ordenar por st_mtime ... o conseguir los archivos nombrados con una marca de tiempo en el nombre.


Tenga en cuenta que si está en Darwin (Mac OS X), el tiempo de creación está disponible. Desde la página del manual de stat(2):

Sin embargo, cuando se define la macro _DARWIN_FEATURE_64_BIT_INODE, la estructura stat A continuación, se define como:

struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is defined */ 
    dev_t   st_dev;   /* ID of device containing file */ 
    mode_t   st_mode;   /* Mode of file (see below) */ 
    nlink_t   st_nlink;   /* Number of hard links */ 
    ino_t   st_ino;   /* File serial number */ 
    uid_t   st_uid;   /* User ID of the file */ 
    gid_t   st_gid;   /* Group ID of the file */ 
    dev_t   st_rdev;   /* Device ID */ 
    struct timespec st_atimespec;  /* time of last access */ 
    struct timespec st_mtimespec;  /* time of last data modification */ 
    struct timespec st_ctimespec;  /* time of last status change */ 
    struct timespec st_birthtimespec; /* time of file creation(birth) */ 
    off_t   st_size;   /* file size, in bytes */ 
    blkcnt_t  st_blocks;  /* blocks allocated for file */ 
    blksize_t  st_blksize;  /* optimal blocksize for I/O */ 
    uint32_t  st_flags;   /* user defined flags for file */ 
    uint32_t  st_gen;   /* file generation number */ 
    int32_t   st_lspare;  /* RESERVED: DO NOT USE! */ 
    int64_t   st_qspare[2];  /* RESERVED: DO NOT USE! */ 
}; 

Nota el campo st_birthtimespec. Tenga en cuenta, también, que todas las veces están en struct timespec valores, por lo que hay menos de un segundo de tiempo (tv_nsec da resolución de nanosegundos). POSIX 2008 <sys/stat.h> requiere que el tiempo struct timespec se mantenga en los tiempos estándar; Darwin sigue eso.

+0

Lamentablemente, los archivos son creados por otra aplicación. Lamentablemente, no tengo permiso para cambiar nada al respecto. – Srv19

6

para obtener la fecha de creación del archivo en Linux, yo uso el siguiente método

[email protected]# cat <<_eof> test.txt 
> Hello 
> This is my test file 
> _eof 
[email protected]# cat test.txt 
Hello 
This is my test file 
[email protected]# ls -i test.txt 
2097517 test.txt 
[email protected]# 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 

atime: Archivo de tiempo pasado se abre o se ejecuta

ctime: Tiempo de la información de i-nodo se actualiza.ctime también se actualiza cuando el archivo se modifica

-mtime: Última hora de modificación

crtime: Archivo momento de la creación

+2

Gracias por su respuesta, pero debo señalar que mi pregunta fue sobre el uso de las funciones de linux core c, no cómo obtener tiempo de creación en shell. – Srv19

Cuestiones relacionadas