十四、文件和目录——文件时间和utime函数

14.1 文件时间

  存在于 stat 结构体中

  

14.2 文件时间函数

14.2.1 介绍

  utime(修改文件的存取时间和更改时间)
  相关函数 utimes,stat

1 #include <sys/types.h>
2 #include <utime.h>
3 int utime(const char * filename, struct utimbuf * buf);
  • 函数功能
    • 更改文件的存取和修改时间
    • utime 会自动更新 st_ctime 的值
  • 参数 buf
    • 空指针:则取当前时间
      • 进程的有效用户 ID 必须等于该文件的所有者ID
      • 或者进程对该文件具有写权限
    • 非空:取 utimebuf 结构体中的时间
      • 进程有效用户ID 等于该文件的所有者ID
      • 或者进程是超级用户进程    
  • 返回值
    • 如果参数buf为空指针(NULL),则该文件的存取时间和更改时间全部会设为目前时间。
    • 执行成功则返回 0,失败返回-1,错误代码存于errno。
  • 错误代码
    • EACCESS 存取文件时被拒绝,权限不足
    • ENOENT 指定的文件不存在。
1 结构体 utimbuf 定义如下
2 struct utimbuf{
3     time_t actime;  //访问时间
4     time_t modtime;  //修改时间
5 };

14.2.3 例子

  file_time.c

 1 #include <time.h>
 2 #include <sys/types.h>
 3 #include <utime.h>
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <errno.h>
 7 #include <sys/stat.h>
 8 #include <fcntl.h>
 9 #include <string.h>
10 #include <unistd.h>
11 #include <memory.h>
12 
13 // ctime 函数 将事件转换成字符串输出
14 void out(struct stat buff)
15 {
16     time_t val_atime = (time_t)buff.st_atime;
17     time_t val_mtime = (time_t)buff.st_mtime;
18     time_t val_ctime = (time_t)buff.st_ctime;
19     printf("atime: %s\n", ctime(&val_atime));
20     printf("mtime: %s\n", ctime(&val_mtime));
21     printf("ctime: %s\n", ctime(&val_ctime));
22 }
23 
24 //获取文件属性信息
25 struct stat get_stat(char *file, struct stat buff)
26 {
27     memset(&buff, 0, sizeof(buff));
28     if(lstat(file, &buff) < 0) {
29         perror("lstat error");
30         exit(1);
31     }
32 
33     return buff;
34 }
35 
36 int main(int argc, char *argv[])
37 {
38     if(argc < 2) {
39         fprintf(stderr, "usage:%s file\n", argv[0]);
40         exit(1);
41     }
42 
43     struct stat buff;
44     buff = get_stat(argv[1], buff);
45 
46     //备份原先的时间
47     struct stat bak_stat = buff;
48     out(buff);
49     printf("=============================\n");
50 
51     //设置文件的事件为当前系统时间
52     utime(argv[1], NULL);
53     buff = get_stat(argv[1], buff);
54     out(buff);
55     printf("=============================\n");
56 
57     //把文件的时间恢复成之前的时间
58     struct utimbuf timebuf;
59     timebuf.actime = bak_stat.st_atime;
60     timebuf.modtime = bak_stat.st_mtime;
61     utime(argv[1], &timebuf);
62     buff = get_stat(argv[1], buff);
63     out(buff);
64 
65     return 0;
66 }

  编译执行:

  

  ctime 的时间是 i 节点的最后更改时间,只要调用了 utime 就会自动修改  ctime。

posted @ 2018-05-21 00:14  游戏进行中  阅读(445)  评论(0编辑  收藏  举报