如何在 Linux 中获取文件创建日期?

2024-11-11 08:27:00
admin
原创
137
摘要:问题描述:我正在处理一批文件,这些文件包含同一对象在其生命周期的不同时间的信息,唯一的排序方法是按创建日期。我使用的是这个://char* buffer has the name of file struct stat buf; FILE *tf; tf = fopen(buffer,"r"...

问题描述:

我正在处理一批文件,这些文件包含同一对象在其生命周期的不同时间的信息,唯一的排序方法是按创建日期。我使用的是这个:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1106  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   66  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   60  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   66  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   61  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用