Как узнать дату создания файла в Linux? - PullRequest
9 голосов
/ 08 мая 2011

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

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

10 голосов
/ 08 мая 2011

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

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


Обратите внимание, что если вы работаете в Darwin (Mac OS X), время создания доступно.Со страницы руководства для stat(2):

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

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

Обратите внимание на поле st_birthtimespec.Также обратите внимание, что все времена находятся в значениях struct timespec, поэтому есть временная задержка менее секунды (tv_nsec дает наносекундное разрешение).POSIX 2008 <sys/stat.h> требует, чтобы struct timespec время соответствовало стандартному времени;Дарвин следует этому.

8 голосов
/ 08 мая 2011

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

#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 в своей структуре статистики, проверив sys / stat.h или используя какую-либо конструкцию autoconf.

6 голосов
/ 07 января 2013

Чтобы получить дату создания файла в 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: время создания файла

5 голосов
/ 08 мая 2011

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

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() принимает имя файла в качестве параметра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...