如何在 Linux 中获取文件创建日期?
- 2024-11-11 08:27:00
- admin 原创
- 21
问题描述:
我正在处理一批文件,这些文件包含同一对象在其生命周期的不同时间的信息,唯一的排序方法是按创建日期。我使用的是这个:
//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 下还有其他更可靠/更简单的方法来获取文件创建日期吗?
解决方案 1:
最接近“创建日期”的是st_ctime
中的成员struct stat
,但它实际上记录了 inode 上次更改的时间。如果您创建文件并且从未修改其大小或权限,则该时间可作为创建时间。否则,至少在标准 Unix 系统中,没有文件创建时间的记录。
为了您的目的,请按st_mtime
...排序或获取名称中带有时间戳的文件。
请注意,如果您使用的是 Darwin (Mac OS X),则可以查看创建时间。从手册页中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! */
};
注意st_birthtimespec
字段。还要注意,所有时间都是数值struct timespec
,因此存在亚秒级计时(tv_nsec
提供纳秒级分辨率)。POSIX 2008<sys/stat.h>
要求struct timespec
按照标准时间计时;Darwin 遵循这一点。
解决方案 2:
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
", birthtime(st));
}
return 0;
}
您需要通过检查 sys/stat.h 或使用某种 autoconf 构造来确定您的系统是否在其 stat 结构中具有 st_birthtime。
解决方案 3:
文件创建时间不存储在任何地方,您只能检索以下之一:
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()
以文件名作为参数)。
解决方案 4:
为了获取 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:inode 信息更新的时间。文件被修改时,ctime 也会更新。
mtime: 最后修改时间
crtime:文件创建时间
解决方案 5:
对于较新的 Linux 版本,其中xstat
包括btime
。https ://unix.stackexchange.com/a/407305/103120
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件