文件的访问时间和修改时间可以用utime函数改变。
- #include <utime.h>
- int utime(const char *pathname, const struct utimebuf *times);
- 成功返回0,失败返回-1。
这个函数使用的结构体为:
- struct utimbuf {
- time_t actime; /* 访问时间 */
- time_t modtime; /* 修改时间 */
- };
在这个结构体里的两个时间值是日期时间,正如1.10节描述的那样,是从Epoch开始的秒数。
这个函数的操作和执行它所需的权限,取决于时间参数时否为NULL。
1、如果times为null指针,访问时间和修改时间都被设为当前时间。要这样做的话,进程的有效有用ID必须和文件的属主ID相同,或者进程必须有这个文件的写权限。
2、如果times是一个非空指针,访问时间和修改时间设为times指向的结构体的值。在这种情况下,进程的有效用户ID必须和文件的属主ID相同,或者进程必须是一个超级用户进程。仅有文件的写权限是不够的。
注意我们不能为状态改变时间指定一个值,st_ctime--i-node最近修改的值--因为这个域utime函数被调用时会被自动更新。
UNIX系统的一些实现,touch命令使用了这个函数。还有,标准存档程序,tar和cpio,选择性地调用utime来把文件的时间设为文件被存档的时间。
下面的程序使用O_TRUNC选项的open函数把文件裁切成0长度,但不改变它们的访问或修改时间。要这样做,程序首先通过stat函数得到时间,接着裁切文件,然后用utime函数重设时间:
- #include <fcntl.h>
- #include <utime.h>
- int
- main(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) {
- printf("%s: stat error\n", argv[i]);
- continue;
- }
- if ((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0) {
- printf("%s: open error\n", argv[i]);
- continue;
- }
- close(fd);
- timebuf.actime = statbuf.st_atime;
- timebuf.modtime = statbuf.st_mtime;
- if (utime(argv[i], &timebuf) < 0) {
- printf("%s: utime error\n", argv[i]);
- continue;
- }
- }
- exit(0);
- }
$ ls -l tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:35 tmp
$ ls -lu tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:29 tmp
$ ls -lc tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:35 tmp
$ date
2012年 02月 22日 星期三 20:37:29 CST
$ ./a.out tmp
$ ls -l tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:35 tmp
$ ls -lu tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:29 tmp
$ ls -lc tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:37 tmp
正如我们预期的一样,最后修改时间和最后访问时间都没有改变。然而,状态改变时间改成了程序运行的时间。
阅读(469) | 评论(0) | 转发(0) |