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