文件的时间

文件的时间

引言

ls(1)命令按照文件的时间排序可以参考如下选项:

  • 系统默认(用-l或者-t)是按照文件的修改时间的先后排序
  • -u选项按访问时间排序
  • -c选项按状态更改时间排序

其实就是按照stat结构体下面的3个时间值中的一个排序。

  1. struct stat
  2. {
  3. mode_t st_mode; /* file type & mode (permissions) */
  4. ino_t st_ino; /* i-node number (serial number) */
  5. dev_t st_dev; /* device number (file system) */
  6. dev_t st_rdev; /* device number for special files */
  7. nlink_t st_nlink; /* number of links */
  8. uid_t st_uid; /* user ID of owner */
  9. gid_t st_gid; /* group ID of owner */
  10. off_t st_size; /* size in bytes, for regular files */
  11. struct timespec st_atim; /* time of last access */
  12. struct timespec st_mtim; /* time of last modification */
  13. struct timespec st_ctim; /* time of last file status change */
  14. blksize_t st_blksize; /* best I/O block size */
  15. blkcnt_t st_blocks; /* number of disk blocks allocated */
  16. };

注意,stat结构中的大多数成员都是基本系统数据类型。

timespec结构类型如下,其定义在linux/time.h:

  1. struct timespec {
  2. time_t tv_sec; /* seconds */
  3. long tv_nsec; /* nanoseconds */
  4. };

在2008年版以前的标准中,时间字段定义成st_atimest_mtime以及st_ctime,它们都是time_t类型(以秒来表示)。而之后timespec结构提供了更精度的时间戳。为了保持兼容性,旧的名字可以定义成tv_sec成员。例如,st_atime可以定义成st_atim.tv_sev。(注意少了一个e字母)

Field Description Example ls(1) option
st_atim last-access time of file data read -u
st_mtim last-modification time of file data write 默认
st_ctim last-change time of i-node status chmod、chown -c

表1 与每个文件相关的3个时间值

修改时间(st_mtim)是文件内容最后一次被修改的时间。

状态更改时间(st_ctim)是该文件的i节点最后一次被修改的时间。

函数futimens、utimensat和utimes

一个文件的访问和修改时间可以用以下几个函数更改。futimensutimensat函数可以指定纳秒级精度的时间戳。

#include <sys/stat.h>

int futimens(int fd, const struct timespec times[2]);

int utimensat(int fd, const char *path, const struct timespec times[2], int flag);

Both return: 0 if OK, ?1 on error

times数组参数的第一个元素包含访问时间,第二个元素包含修改时间。这两个时间值是日历时间。该值是自协调世界(Coordinated Universal Time, UTC)1970年1月1日00:00:00这个特定的时间以来所经过的秒数累计值。早期的手册称UTC为格林尼治标准时间。

futimensutimensat函数都包含在POSIX.1中,而下面的utimes函数是在Single UNIX Specification的XSI扩展选项中。

#include <sys/time.h>

int utimes(const char *pathname, const struct timeval times[2]);

Returns: 0 if OK, ?1 on error

utimes函数对路径名进行操作。times参数指向包含两个时间戳(访问时间和修改时间)元素的数组,两个时间戳是用秒和微妙表示的。

  1. struct timeval {
  2. time_t tv_sec; /* seconds */
  3. long tv_usec; /* microseconds */
  4. };

注意,我们不能对状态变更时间st_ctim(i节点最近被修改的时间)指定一个值,因为调用utimes函数时,此字段会被自动更新。

在某些UNIX版本中,touch(1)命令使用这些函数中的某一个。

实例

使用带O_TRUNC选项的open函数将文件长度截断为0,但并不更改其访问时间。为了做到这点,首先使用stat函数得到这些时间,然后截断文件,最后再用futimens函数重置这两个时间。

  1. /**
  2. * 文件内容:使用带O_TRUNC选项的open函数将文件长度截断为0,但并不更改其访问时间
  3. * 作者:[email protected]
  4. * 时间:2016年 11月 04日 星期五 22:00:14 CST
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <unistd.h>
  13. #include <fcntl.h>
  14. int main(int argc, char *argv[])
  15. {
  16. int fd = 0;
  17. struct stat statbuf;
  18. struct timespec times[2];
  19. int i = 0;
  20. for (i = 1; i < argc; i++)
  21. {
  22. if (stat(argv[i], &statbuf) < 0)
  23. {
  24. printf("%s: stat error: %s\n", argv[1], strerror(errno));
  25. continue;
  26. }
  27. if (fd = open(argv[i], O_RDWR | O_TRUNC) < 0)
  28. {
  29. printf("%s: open error: %s\n", argv[1], strerror(errno));
  30. continue;
  31. }
  32. times[0] = statbuf.st_atim;
  33. times[1] = statbuf.st_mtim;
  34. if (futimens(fd, times) < 0)
  35. {
  36. printf("%s: futimens error: %s\n", argv[1], strerror(errno));
  37. }
  38. if (fd > 0)
  39. {
  40. close(fd);
  41. }
  42. }
  43. exit(0);
  44. }

代码1 futimens函数实例

程序运行如下:

$ ls -l test test.c    <------------ 查看长度和最后修改时间
-rwxrwxr-x 1 fireway fireway 9813  8月 14 18:14 test
-rw-rw-r-- 1 fireway fireway  475  8月 14 18:04 test.c
$ ls -lu test test.c    <-------------查看最后访问时间
-rwxrwxr-x 1 fireway fireway 9813  8月 14 18:14 test
-rw-rw-r-- 1 fireway fireway  475  9月  9 22:44 test.c
$ date    <---------------打印当天日期
2016年 11月 03日 星期四 07:54:21 CST
$ a.out test test.c    <----------运行上面的程序
$ ls -l test test.c    <--------------检查结果
-rwxrwxr-x 1 fireway fireway 0 11月  3 07:55 test
-rw-rw-r-- 1 fireway fireway 0 11月  3 07:55 test.c
$ ls -lu test test.c    <----------------检查最后访问时间
-rwxrwxr-x 1 fireway fireway 0  8月 14 18:14 test
-rw-rw-r-- 1 fireway fireway 0  9月  9 22:44 test.c
$ ls -lc test test.c    <-------------- 检查状态更改时间
-rwxrwxr-x 1 fireway fireway 0 11月  3 07:55 test
-rw-rw-r-- 1 fireway fireway 0 11月  3 07:55 test.c

最后的访问时间没有修改,而修改时间和状态更改的时间则变更为程序运行的时间。

参考

UNIX环境高级编程(第三版)    4.20 函数futimens、utimensat和utimes

时间: 2024-10-12 17:42:25

文件的时间的相关文章

nginx配置静态文件过期时间

1.配置指定文件不记录日志,同时设置静态文件过期时间location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 15d; access_log off;}2.只配置静态文件过期时间#配置静态文件过期时间location ~ \.(js|css)${ expires 15d;}d 天 h 小时 m 分钟 用curl 查看本地127.0.0.1访问.如:curl -x127.0.0.1:80 www.dd.com/data/cache/style_1_fo

一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 @for&ever 2010-07-03 功能: 获取指定目录下面符合一定规则的文件名称和文件修改时间,并保存到指定的文件中 脚本如下: #!/usr/bin/env python# -*- coding: utf-8 -*- '''Created on 2010-7-2 @author: fore

使用ant剪切、重命名、修改文件访问时间

下面提供几个命令,用来剪切文件.重命名文件.创建或修改文件访问时间,如下: <?xml version="1.0" encoding="UTF-8"?> <project name ="test" default="all" basedir="."> <target name ="all"> <!-- 剪切文件(含过滤条件)--> <

Qt下如何修改文件的时间

提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to the current time. * utime.c is a file you should change it by yourself */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h>

获取、设置文件的时间

function CovFileDate(Fd:_FileTime):TDateTime; { 转换文件的时间格式 } var Tct:_SystemTime; Temp:_FileTime; begin FileTimeToLocalFileTime(Fd,Temp); FileTimeToSystemTime(Temp,Tct); CovFileDate:=SystemTimeToDateTime(Tct); end; procedure GetFileTime(const Tf:strin

Nginx 配置静态文件过期时间&防盗链

[[email protected] ~]# vim /usr/local/nginx/conf/vhosts/linux.conf location ~ .*\.(gif|jpeg|jpg|png|bmp|swf)$ { access_log off; expires 1d;  #过期时间 1天 } location ~ .*\.(js|css)  #此也也可改为  \.(js|css)来匹配 {     access_log off; expires 2h; } [[email protec

文件的时间属性atime,mtime,ctime

atime (access time)最近访问内容的时间 mtime (modify time)最近修改内容的时间 ctime (change time)最近更改文件的时间,包括文件名.大小.内容.权限.属主.属组等 stat filename 查看文件的三个时间属性 echo "dahdgajk">>filename 追加内容会改变文件的mtime和ctime cat filename 查看文件内容会改变文件的atime touch filename 会改变文件的三个ti

shell脚本判断linux文件修改时间后执行操作

判断linux文件修改时间后执行操作 创建脚本 vi /var/tomcat/find.sh #!/bin/bash a=`stat -c %Y /var/tomcat/logs/catalina.out`  //获取文件的修改时间(秒为单位) b=`date +%s`       //获取当前系统的时间 (秒为单位) if [ $[ $b - $a ] -gt 1800 ];   //判断当前时间和文件修改时间差(30分钟) then /sbin/service tomcat restart

UNIX高级环境编程(5)Files And Directories - 文件相关时间,目录文件相关操作

?1 File Times 每个文件会维护三个时间字段,每个字段代表的时间都不同.如下表所示: 字段说明: st_mtim(the modification time)记录了文件内容最后一次被修改的时间. st_ctim(the changed-status time)记录了文件的i-node最后一次被修改的时间,如修改文件权限位,修改文件所有者ID,修改关联到该文件的link数目. i-node中的信息和文件的实际内容是分离的,所以当更新i-node时,需要更新的时st_ctim(the ch