Как получить дату создания файла в 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;

но это, похоже, не работает. Что я делаю не так? Есть ли другие, более надежные / простые способы получить дату создания файла под Linux?

4 ответов


fstat работает с файловыми дескрипторами, а не с файловыми структурами. Самый простой вариант:

#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;
}

вам нужно будет выяснить, имеет ли ваша система st_birthtime в своей структуре stat, проверив sys/stat.h или с использованием какой-то конструкции autoconf.


ближайшим приближением к "дате создания" является st_ctime член struct stat, но это фактически записывает последний раз, когда индекс изменился. Если вы создаете файл и никогда не изменяете его размер или разрешения, это работает как время создания. В противном случае, нет никаких сведений о том, когда файл был создан, по крайней мере в стандартных системах Unix.

для ваших целей, сортировка по st_mtime...или получить файлы с именем с меткой времени в имени.


обратите внимание, что если вы находитесь на Darwin (Mac OS X), время создания доступно. Из man-страницы для stat(2):

однако, когда макрос _DARWIN_FEATURE_64_BIT_INODE определено, структура stat теперь будет определена как:

 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! */
 };

Примечание


получить дату создания файла в Linux, я использую следующий метод

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

atime: последний раз файл был открыт или выполнен

ctime: время обновления информации об индексе. ctime также обновляется при изменении файла

mtime: время последнего изменения

crtime: время создания файла


время создания файла нигде не хранится, вы можете получить только одно из следующих:

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 */

ваш код должен дать вам, однако, последнее время изменения. Примечание: Вы можете использовать stat() вместо fstat() без открытия файла (stat() принимает имя файла как параметр).