|
设置文件的访问时间和修改时间(纳秒级别)。 1.头文件 #include <fcntl.h> /* 定义了一些常量 以AT_开头*/ #include <sys/stat.h> 2.函数原型 int utimensat(int dirfd, const char *pathname,const struct timespec times[2], int flags); 3.参数 dirfd:目录文件描述符。如在当前目录则可以使用AT_FDCWD表示pathname是绝对路径。如果不在当前目录,则需要指定要修改的pathname的目录。 pathname:要修改时间的文件路径。 times:是一个包含两个 struct timespec 的数组,第一个表示访问时间,第二个表示修改时间,可以将times任一数组元素的 tv_nsec 字段为如下数值: ⚫NULL:这时会将访问时间和修改时间都设置为当前时间。 ⚫UTIME_NOW:则表示相应的时间戳设置为当前时间,此时忽略相应的 tv_sec 字段。 ⚫UTIME_OMIT:则表示相应的时间戳保持不变,此时忽略 tv_sec 字段。 flags:行为控制。 ⚫0:默认值,不特殊处理符号链接或路径。 ⚫AT_SYMLINK_NOFOLLOW:修改符号链接本身的时间,而不是其指向的目标文件,用于需要更新符号链接的情况。 ⚫AT_EMPTY_PATH:当路径为空时,允许操作当前目录或文件描述符,适用于一些特殊场景(如更新当前目录的时间)。 4.返回值 成功返回0,失败返回-1,并设置errno以指示返回错误类型 。 5.示例:(使用utimensat修改文件访问时间) ... ... ... void update_file_time(const char *filename){ struct timespec times[2]; int i; for (i=0; i<2; i++) { times.tv_sec = time(NULL); times.tv_nsec = 666; } if (utimensat(AT_FDCWD, filename, times, AT_SYMLINK_NOFOLLOW) == -1) { perror("utimensat"); exit(EXIT_FAILURE); } printf("File time updated successfully.\n"); } |
这里只测试了AT_FDCWD和AT_SYMLINK_NOFOLLOW,用法上面已经说明,这里不做过多赘述。
|