|
在前面的struct stat结构体中的参数基本介绍完毕,还有最后一个属性,是文件的时间属性,时间属性都包括如下内容: 文件最后访问时间:顾名思义是指最后一次读取文件内容的时间,如使用read函数读取文件的内容之后,此项时间就会发生变化。 文件内容最后修改时间:指文件内容发生改变,如使用write函数向文件中写入数据,变会发生变化。 文件状态最后被修改时间:状态更改时指文件的inode节点最后一次被修改的时间。 那什么情况下inode节点话发生变化呢?下面就简单介绍下。 1.文件内容被修改:通过函数对文件读写时,会更新inode节点的修改时间和状态更改时间。如函数fwirte()或者wirte()。 2.文件属性修改:修改文件的权限、所有者或者文件名,就会更新inode节点的状态更改时间。如前面提到的chmod()、 chown()、 rename()函数。 3.创建或删除文件:创建新的文件或者删除文件也会影响inode节点。如open()、creat()、unlink()、remove()。 那么如何修改文件的时间属性呢?下面就来介绍4个修改时间属性的函数: 修改时间属性的函数有utime()、utimes()、futimens()、utimensat()等函数,下表中为函数的基本区别: 上面介绍了修改时间属性函数的基本区别,需要注意的是,不是所有的用户都可以修改文件的时间属性,只有超级用户和有效用户ID和文件用户ID相匹配的进程才会拥有修改权限。 utime设置文件的访问时间和修改时间(秒级别)。 1.头文件 #include <sys/types.h> #include <utime.h> 2.函数原型 int utime(const char *filename, const struct utimbuf *times); 3.参数 filename:指向文件路径名的指针,指定要修改时间的文件。如果文件路径无效或者文件不存在,utime() 会返回错误。 times:指向 struct utimbuf 结构体的指针,该结构体包含两个字段,用于指定新的访问时间和修改时间。 这里介绍一下struct utimbuf结构体: struct utimbuf { time_t actime; /* 最后访问时间access time */ time_t modtime; /* 最后修改时间modification time */ }; 4.返回值 成功返回 0 ,失败返回-1,并且会返回错误原因。 5.示例:(使用utime修改文件访问时间) #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <utime.h> #include <errno.h> #include <string.h> #include <time.h> void update_file_time(const char *filename); int main(){ const char *filename = "file_utime.txt"; int res = 0; struct stat statbuf; printf("File name: %s\n", filename); if (stat(filename, &statbuf) == -1) { if (errno == ENOENT) { fprintf(stderr,"File does not exist: %s\n", filename); } else { perror("stat"); } return EXIT_FAILURE; } update_file_time(filename); return EXIT_SUCCESS; } void update_file_time(const char *filename) { struct utimbuf new_times; new_times.actime = time(NULL); new_times.modtime = time(NULL); if (utime(filename, &new_times) == -1) { perror("utime"); exit(EXIT_FAILURE); } printf("File time updated successfully.\n"); } |
先使用stat命令查看一下file_utime.txt时间戳: $ stat file_utime.txt File: file_utime.txt Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051d Inode: 5242954 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ elf) Gid: ( 1000/ elf) Access: 2024-09-10 20:46:17.894084787 +0800 Modify: 2024-09-10 14:03:28.000000000 +0800 Change: 2024-09-10 14:03:28.393749310 +0800 Birth: 2024-09-10 14:00:57.882938108 +0800 |
运行utime_test命令,修改时间属性: File name: file_utime.txt File time updated successfully. |
修改时间属性后再使用stat命令查看时间戳的变化: $ stat file_utime.txt File: file_utime.txt Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051d Inode: 5242954 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ elf) Gid: ( 1000/ forlinx) Access: 2024-11-06 21:11:21.000000000 +0800 Modify: 2024-11-06 21:11:21.000000000 +0800 Change: 2024-11-06 21:11:21.526051882 +0800 Birth: 2024-09-10 14:00:57.882938108 +0800 |
执行完utime_test命令后,可以看到文件的访问时间(Access time)和文件修改时间(Modification time)发生了变化,改成系统当前时间了。我们并没有修改文件状态更改时间(Change time),然而它也跟着修改了,这是一种系统机制,在ctime中,记录着文件最后一次修改的时间,对于文件的任何修改包括时间属性的更新,都会更新ctime的时间。
|