一個文件的訪問和修改時間可以用utime函數更改。
#include <utime.h>int utime( const char *pathname, const struct utimbuf *times );返回值:若成功則返回0,若出錯則返回-1
此函數所使用的數據結構是:
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,或者進程必須是一個超級用戶進程。對文件只有寫權限是不夠的。
注意,我們不能對更改狀態時間st_ctime指定一個值,當調用utime函數時,此字段將被自動更新。
在某些UNIX系統版本中,touch(1)命令使用此函數。另外,標準歸檔程序tar(1)和cpio(1)可選地調用utime,以便將一個文件的時間設置為將它歸檔時保存的時間值。
程序清單4-6 utime函數實例
使用帶O_TRUNC選項的open函數將文件長度截短為0,但并不更改其訪問時間及修改時間。為了做到這一點,首先用stat函數得到這些時間,然后截短文件,最后再用utime函數復位這兩個時間。
[root@localhost apue]# cat PRog4-6.c #include "apue.h"#include <fcntl.h>#include <utime.h>intmain(int argc, char *argv[]){ int i, fd; struct stat statbuf; struct utimbuf timebuf; for(i=1; i<argc; i++) { if(stat(argv[i], &statbuf) < 0) { err_ret("%s: stat error", argv[i]); continue; } if((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0) { err_ret("%s: open error", argv[i]); continue; } close(fd); timebuf.actime = statbuf.st_atime; timebuf.modtime = statbuf.st_mtime; if(utime(argv[i], &timebuf) < 0) { err_ret("%s: utime error", argv[i]); continue; } } exit(0);}
運行結果:
[root@localhost apue]# ls -l file.hole-rw-r--r-- 1 root root 0 12-30 00:38 file.hole[root@localhost apue]# date2014年 01月 03日 星期五 16:34:48 PST[root@localhost apue]# ./prog4-6 file.hole[root@localhost apue]# ls -l file.hole-rw-r--r-- 1 root root 0 12-30 00:38 file.hole[root@localhost apue]# ls -lu file.hole-rw-r--r-- 1 root root 0 12-30 00:38 file.hole[root@localhost apue]# ls -lc file.hole-rw-r--r-- 1 root root 0 01-03 16:34 file.hole
正如我們所預見的一樣,最后修改時間和最后訪問時間未變。但是更改狀態時間則更改為程序運行時的時間。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答