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) < ) {
printf("utime foo error: %s\n", strerror(errno));
exit(-);
}
if (stat("bar", &statbuf) < ) {
printf("stat error: %s\n", strerror(errno));
exit(-);
}
if ((fd = open("bar", O_RDWR | O_TRUNC)) < ) {
printf("open error: %s\n", strerror(errno));
exit(-);
}
close(fd);
timebuf.actime = statbuf.st_atime;
timebuf.modtime = statbuf.st_mtime;
if (utime("bar", &timebuf) < ) {
printf("utime bar error: %s\n", strerror(errno));
exit(-);
}
exit();
}

编译该程序,生成文件 utimedemo,然后运行该文件,

lienhua34:demo$ gcc -o utimedemo utimedemo.c
lienhua34:demo$ ls -l foo bar 查看文件最后修改时间
-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间
-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ date
2014年 09月 16日 星期二 :: CST
lienhua34:demo$ ./utimedemo
lienhua34:demo$ ls -l foo bar 查看文件最后修改时间-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo

ls 命令按这个三个时间值中的一个排序进行显示。系统默认(用 -l 或-t 选项调用时),它按文件的最后修改时间的先后排序显示。-u 选项使其用最后访问时间进行排序,-c 选项则使其用更改状态时间进行排序。

(done)

UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数的更多相关文章

  1. UNIX环境编程学习笔记(13)——文件I/O之标准I/O流

    lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...

  2. UNIX环境编程学习笔记(12)——文件I/O之目录操作

    lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...

  3. UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接

    lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...

  4. UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

    lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位  st_mod ...

  5. UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...

  6. UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制

    lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...

  7. UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

    lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...

  8. UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构

    lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...

  9. UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O

    lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...

随机推荐

  1. JAVA-数据库之添加记录

    相关资料:<21天学通Java Web开发> 添加记录1.使用语句对象Statement的executeUpdate()方法可以很方便地实现添加记录.2.只需要在executUpdae() ...

  2. php 裁剪图片类

    <?php /* *说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高 * writt ...

  3. iOS 设置导航栏全透明

    - (void)viewWillAppear:(BOOL)animated{ //设置导航栏背景图片为一个空的image,这样就透明了 [self.navigationController.navig ...

  4. burpsuite两个变量的爱情故事

    抓包的时候在攻击类型处选择[Cluster bomb] 在payload type这里设置类型为[simple list] 第一个是账号 第二个是密码 分批加载即可

  5. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  6. html标签之img

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Spring高级装配(一) profile

    Spring高级装配要学习的内容包括: Spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 以上属于高级一点的bean装配技术,如果你没有啥 ...

  8. winform上控件的拖拽小结

    这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考. 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西. 事件: It ...

  9. powerdesigner 导出excel

    PD菜单栏中,依次点击 Tools ->Excute Commands->Edit/Run Script.. 填入 '*********************************** ...

  10. 【oneday_onepage】——Microsoft to acquire Nokia's mobile phone business

    Nokia will focus on network infrastructure, mapping and locations services and technology developmen ...