UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
lienhua34
2014-09-16
1 文件的时间
每个文件都有三个时间字段,如表 1 所示。
说明 | 字段 |
st_atime | 文件数据的最后访问时间 |
st_mtime | 文件数据的最后修改时间 |
st_ctime | i 节点状态的最后更改时间 |
最后修改时间是文件内容最后一次被修改的时间。更改状态时间是该文件的 i 节点最后一次被修改的时间。
2 utime 函数
utime 函数提供了对文件最后访问时间和最后修改时间的更改功能。
#include <utime.h>
int utime(const char *pathname, const struct utimbuf *times);
返回值:若成功则返回0,若出错则返回-1.
其中 utimbuf 结构的定义如下,
struct utimbuf { time_t actime; /* access time */ time_t modtime; /* modification time */ };
此结构中的两个时间值是日历时间,即自 1970 年 1 月 1 日 00:00:00 以来国际标准时间所经过的秒数。
此函数的操作以及所需要的权限取决于 times 参数是否是 NULL。
• 如果 times 参数是一个空指针,则访问时间和修改时间两者都被设置为当前时间。所需要的权限:进程的有效用户 ID 必须等于该文件的所有者 ID,或者进程对该文件必须具有写权限。
• 如果 times 是非空指针,则访问时间和修改时间被设置为 times 所指向的结构中的值。所需要的权限:进程的有效用户 ID 必须等于该文件的所有者 ID,或者进程必须是一个超级用户进程。
例子:
下面程序将文件 foo 的访问时间和修改时间都更改为当前时间。对于文件 bar,则先使用 stat 函数获取该文件的访问时间和修改时间,然后使用O_TRUNC 选项调用 open 函数打开文件 bar(会导致该文件的访问时间和修改时间都发生变更),最后将该文件的这两个时间还原为调用 stat 函数时的值。
#include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <utime.h> #include <errno.h> #include <string.h> int main(void) { int i, fd; struct stat statbuf; struct utimbuf timebuf; if (utime("foo", NULL) < 0) { printf("utime foo error: %s\n", strerror(errno)); exit(-1); } if (stat("bar", &statbuf) < 0) { printf("stat error: %s\n", strerror(errno)); exit(-1); } if ((fd = open("bar", O_RDWR | O_TRUNC)) < 0) { printf("open error: %s\n", strerror(errno)); exit(-1); } close(fd); timebuf.actime = statbuf.st_atime; timebuf.modtime = statbuf.st_mtime; if (utime("bar", &timebuf) < 0) { printf("utime bar error: %s\n", strerror(errno)); exit(-1); } exit(0); }
编译该程序,生成文件 utimedemo,然后运行该文件,
lienhua34:demo$ gcc -o utimedemo utimedemo.c lienhua34:demo$ ls -l foo bar 查看文件最后修改时间 -rw-r--r-- 1 lienhua34 lienhua34 7 9月 15 20:02 bar -rw-rwSr-- 1 lienhua34 lienhua34 0 9月 3 23:51 foo lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间 -rw-r--r-- 1 lienhua34 lienhua34 7 9月 16 21:13 bar -rw-rwSr-- 1 lienhua34 lienhua34 0 9月 3 23:51 foo lienhua34:demo$ date 2014年 09月 16日 星期二 21:14:28 CST lienhua34:demo$ ./utimedemo lienhua34:demo$ ls -l foo bar 查看文件最后修改时间-rw-r--r-- 1 lienhua34 lienhua34 0 9月 15 20:02 bar -rw-rwSr-- 1 lienhua34 lienhua34 0 9月 16 21:14 foo lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间-rw-r--r-- 1 lienhua34 lienhua34 0 9月 16 21:13 bar -rw-rwSr-- 1 lienhua34 lienhua34 0 9月 16 21:14 foo
ls 命令按这个三个时间值中的一个排序进行显示。系统默认(用 -l 或-t 选项调用时),它按文件的最后修改时间的先后排序显示。-u 选项使其用最后访问时间进行排序,-c 选项则使其用更改状态时间进行排序。
(done)
posted on 2014-09-16 21:41 lienhua34 阅读(2007) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端