UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
lienhua34
2014-09-16
1 文件的時間
每個文件都有三個時間字段,如表 1 所示。
| 說明 | 字段 |
| st_atime | 文件數據的最后訪問時間 |
| st_mtime | 文件數據的最后修改時間 |
| st_ctime | i 節(jié)點狀態(tài)的最后更改時間 |
最后修改時間是文件內容最后一次被修改的時間。更改狀態(tài)時間是該文件的 i 節(jié)點最后一次被修改的時間。
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(會導致該文件的訪問時間和修改時間都發(fā)生變更),最后將該文件的這兩個時間還原為調用 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 fools 命令按這個三個時間值中的一個排序進行顯示。系統(tǒng)默認(用 -l 或-t 選項調用時),它按文件的最后修改時間的先后排序顯示。-u 選項使其用最后訪問時間進行排序,-c 選項則使其用更改狀態(tài)時間進行排序。
(done)
轉載于:https://www.cnblogs.com/lienhua34/p/3975894.html
總結
以上是生活随笔為你收集整理的UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP Fatal error: Ca
- 下一篇: iOS 提交应用过程出现的错误及#解决方