zoukankan      html  css  js  c++  java
  • UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数

    lienhua34
    2014-09-16

    1 文件的时间

    每个文件都有三个时间字段,如表 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
    ", strerror(errno));
            exit(-1);
        }
        if (stat("bar", &statbuf) < 0) {
            printf("stat error: %s
    ", strerror(errno));
            exit(-1);
        }
        if ((fd = open("bar", O_RDWR | O_TRUNC)) < 0) {
            printf("open error: %s
    ", 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
    ", 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)

  • 相关阅读:
    hdu 4283 You Are the One ( dp 2012 ACM/ICPC Asia Regional Tianjin Online )
    hdu 4268 Alice and Bob (贪心 2012 ACM/ICPC Asia Regional Changchun Online)
    2sat 讲解
    高斯消元 Java 高精度版 HDU 2449 Gauss Elimination
    poj 3207 Ikki's Story IV Panda's Trick (2sat)
    poj 2723 Get Luffy Out (2 sat + 二分)
    hdu 2604 Queuing (矩阵乘法 求递推式)
    poj 1753 Flip Game (高斯消元 + 枚举 自由变量)
    poj 3683 Priest John's Busiest Day (2sat 模版)
    vs2008新特性
  • 原文地址:https://www.cnblogs.com/lienhua34/p/3975894.html
Copyright © 2011-2022 走看看