第三章_文件和目录 : 函数futimens,utimensat,utimes

函数futimens,utimensat,utimes

一个文件的访问和修改时间可以用以下几个函数修改。

 #include<sys/stat.h>
int futimens(int fd, const struct timespec times[2]);
int utimensat(int fd, const char* path, const struct time spec times[2], int flag);
成功返回0,失败返回-1. 

结构体timespec

struct timespec {
time_t tv_sec; // seconds 
long tv_nsec; // and nanoseconds 
};

两个函数的times结构体数组,第一个指向access time(访问时间),第二个指向modification time(修改时间),这两个时间值是日历时间。
时间戳有四种设置方式:
1.如果时间参数times是空指针。那么两个时间都被设置为当时时间。
2.如果时间参数times指向timespec结构体,任何一个tv_nsec是UTIME_NOW,那么相应的时间戳被设置为当前时间,其tv_sec忽略。
3.如果时间参数times指向timespec结构体,任何一个tv_nsec是UTIME_OMIT,那么相应时间戳不修改,tv_sec忽略。
4.如果时间参数times指向timespec结构体,并且两个tv_nsec既不是UTIME_NOW,也不是UTIME_OMIT,那么时间戳被设置为指向的结构体时间。

#include <sys/time.h>
int utimes(const char *filename, const struct timeval times[2]);
struct timeval {
               long tv_sec;        /* seconds */
               long tv_usec;       /* microseconds */
           };

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

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

测试程序

Unix环境高级编程里的程序
使用O_TRUNC选项的open函数将文件长度截断为0,但并不更改其访问时间和修改时间,为了做到这一点,首先用stat函数得到这些时间,然后截断文件,最后再用futimens函数重置这两个时间。

#include <fcntl.h>
#include <utime.h>
#include <stdio.h>
#include <stdlib.h>
 
struct utimenuf
{
	time_t actime;
	time_t modtime;
};
 
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", argv[i]);
			continue;
		}
 
		if((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0)
		{
			printf("%s: open error",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", argv[i]);
			continue;
		}
	}
	exit(0);
}

在这里插入图片描述
ls -l 查看长度和最后修改时间
ls -lu 查看最后访问时间
ls -lc 查看状态更改时间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值