在前面的struct stat结构体中的参数基本介绍完毕,还有最后一个属性,是文件的时间属性,时间属性都包括如下内容:
结构体字段
说明
struct timespec st_atim;   
文件最后访问时间
struct timespec st_mtim;   
文件内容最后修改时间
struct timespec st_ctim;   
文件状态最后状态改变时间
文件最后访问时间:顾名思义是指最后一次读取文件内容的时间,如使用read函数读取文件的内容之后,此项时间就会发生变化。
文件内容最后修改时间:指文件内容发生改变,如使用write函数向文件中写入数据,变会发生变化。
文件状态最后被修改时间:状态更改时指文件的inode节点最后一次被修改的时间。
那什么情况下inode节点话发生变化呢?下面就简单介绍下。
1.文件内容被修改:通过函数对文件读写时,会更新inode节点的修改时间和状态更改时间。如函数fwirte()或者wirte()
2.文件属性修改:修改文件的权限、所有者或者文件名,就会更新inode节点的状态更改时间。如前面提到的chmod()chown()rename()函数。
3.创建或删除文件:创建新的文件或者删除文件也会影响inode节点。如open()creat()unlink()remove()
那么如何修改文件的时间属性呢?下面就来介绍4个修改时间属性的函数:
修改时间属性的函数有utime()utimes()futimens()utimensat()等函数,下表中为函数的基本区别:
函数
功能
时间精度
utime()
设置文件的访问时间和修改时间
秒级别
utimes()
设置文件的访问时间和修改时间
微秒级别
utimensat()
设置文件的访问时间和修改时间
纳秒级别
futimens()
设置已打开文件的访问时间和修改时间
纳秒级别
上面介绍了修改时间属性函数的基本区别,需要注意的是,不是所有的用户都可以修改文件的时间属性,只有超级用户和有效用户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的时间。

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.5  © 2001-2013 Comsenz Inc.