`

文件时间属性

阅读更多
    每个文件都有 3 个时间属性字段,它们的意义如下:
字段说明例子ls 选项
st_atim文件数据的最后访问时间read-u
st_mtim文件数据的最后修改时间write默认
st_ctimi 节点状态的最后修改时间chmod、chown-c

    注意,系统并不维护对一个 i 节点的最后一次访问时间,所以 access 和 stat 函数并不更改这 3 个时间中的任意一个。
    futimens 和 utimensat 函数可以用来修改一个文件的访问和修改时间属性,它们都指定纳秒级精度的时间戳,用到的数据结构是与 stat 函数族相同的 timespec 结构。
#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);
                       /* 返回值:若成功,都返回 0;否则,都返回 -1 */

    其中 times 数组参数的第一个元素包含访问时间,第二元素包含修改时间。时间戳可以按以下 4 种方式之一进行指定:
    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,则相应的时间戳设置为相应的 tv_sec 和 tv_nsec 字段的值。
    执行这两个函数所要求的优先权取决于 times 参数的值:
    1、如果 times 是一个空指针,或者任一 tv_nsec 字段设为 UTIME_NOW,则进程的有效用户 ID 必须等于该文件的所有者 ID。此外,进程对该文件必须具有写权限,或者进程是一个超级用户进程。
    2、如果 times 是非空指针,并且任一 tv_nsec 既非 UTIME_NOW 也非 UTIME_OMIT,则进程的有效用户 ID 必须等于该文件的所有者 ID,或者进程必须是一个超级用户进程,对文件只具有写权限是不够的。
    3、如果 times 是非空指针,并且两个 tv_nsec 字段的值都是 UTIME_OMIT,就不执行任何的权限检查。
    futimens 函数需要打开文件来更改它的时间,utimensat 函数提供了一种使用文件名更改文件时间的方法。pathname 参数是相对于 fd 参数进行计算的。fd 要么是打开目录的文件描述符,要么设置为 AT_FDCWD(强制通过相对于调用进程的当前目录计算 pathname)。如果 pathname 指定了绝对路径,则忽略 fd 参数。utimensat 的 flag 参数可用于进一步修改默认行为。如果设置了 AT_SYMLINK_NOFOLLOW 标志,则符号链接本身的时间就会被修改。默认是跟随符号链接,并把文件的时间改成符号链接的时间。
    futimens 和 utimensat 函数都包含在 POSIX.1 中,而在 Single UNIX Specification 的 XSI 扩展选项中还定义了一个 utimes 函数:
#include <sys/time.h>

int utimes(const char *pathname, const struct timeval times[2]);
                       /* 返回值:若成功,返回 0;否则,返回 -1 */

/*
struct timeval{
    time_t tv_sec;          // seconds
    long   tv_usec;         // microseconds
};
*/

    该函数对路径名进行操作,times 参数是指向包含两个时间戳(访问时间和修改时间)元素的数组的指针,两个时间戳是用秒和微妙来表示的。
    下面这个程序演示了 futimens 函数如何修改文件的访问时间和修改时间。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char *argv[]){
	int i, fd;
	struct stat	statbuf;
	struct timespec	times[2];
	for(i=1; i<argc; i++){
		if(stat(argv[i], &statbuf) < 0){	// fetch current times
			printf("%s: stat error\n", argv[i]);
			continue;
		}
		if((fd=open(argv[i], O_RDWR |O_TRUNC)) < 0){	// truncate
			printf("%s: open error\n", argv[i]);
			continue;
		}
		times[0] = statbuf.st_atim;
		times[1] = statbuf.st_mtim;
		if(futimens(fd, times) < 0)		// reset times
			printf("%s: futimens error\n", argv[i]);
		close(fd);
	}
	exit(0);
}

    结果演示:
$ ls -l changemod times                     # 查看文件最后修改时间
-rw-r--r--. 1 lei root 0 7月  18 00:03 changemod
-rw-r--r--. 1 lei root 0 7月  18 00:04 times
$ 
$ ls -lu changemod times                    # 查看文件最后访问时间
-rw-r--r--. 1 lei root 0 7月  18 00:04 changemod
-rw-r--r--. 1 lei root 0 7月  18 00:16 times
$ 
$ date                                      # 打印当前日期
2017年 07月 18日 星期二 00:20:20 CST
$ 
$ ./futimensDemo.out changemod times        # 执行程序
$ 
$ ls -l changemod times                        # 再次查看文件最后修改时间
-rw-r--r--. 1 lei root 0 7月  18 00:03 changemod
-rw-r--r--. 1 lei root 0 7月  18 00:04 times
$ 
$ ls -lu changemod times                       # 再次查看文件最后访问时间
-rw-r--r--. 1 lei root 0 7月  18 00:04 changemod
-rw-r--r--. 1 lei root 0 7月  18 00:16 times
$ 
$ ls -lc changemod times                       # 检查文件状态更改时间
-rw-r--r--. 1 lei root 0 7月  18 00:20 changemod
-rw-r--r--. 1 lei root 0 7月  18 00:20 times
$ 

    由此可见,即使我们使用 open 函数的 O_TRUNC 标志修改了文件,但依然可使用 futimens 函数恢复文件原来的访问时间和修改时间,而文件的状态更改时间则会自动更新。
分享到:
评论

相关推荐

    文件时间属性修改器.........................

    在IT领域,文件时间属性是计算机系统中非常基础但至关重要的元素。文件时间属性包括创建时间、修改时间和访问时间,这些信息对文件管理和系统追踪文件活动具有重要意义。本篇文章将详细探讨如何修改文件的时间属性,...

    照片文件时间属性修改

    照片文件的时间属性修改通常通过专门的工具或软件进行,例如压缩包中的"**wjsx.exe**"可能就是一个用于修改文件时间属性的程序。这类工具通常允许用户自定义文件的创建、修改和访问时间,以便按照特定的需求调整文件...

    修改文件时间属性 v1.0.zip

    修改文件时间属性这是一个用来修改文件或文件夹时间属性(创建时间、修改时间、访问时间)和只读、隐藏属性的windows桌面工具。 修改文件时间属性软件用途、功能: 1、显示文件或文件夹的时间属性(创建时间、...

    文件时间属性修改器

    在IT领域,文件时间属性是计算机系统中非常基础但至关重要的元素。文件时间属性包括了创建时间、修改时间和访问时间,这些信息对于跟踪文件的历史、管理文件系统以及进行数据恢复等任务都至关重要。"文件时间属性...

    文件时间属性修改器,创建时间、修改时间、访问时间

    总的来说,“文件时间属性修改器”是一个实用的工具,能够满足用户对文件时间属性定制的需求。然而,它的使用应当谨慎,遵循合法和透明的原则,避免引起不必要的混乱或风险。对于IT专业人员来说,理解并正确运用这类...

    VC 文件时间属性修改代码

    在VC++编程环境中,我们经常会遇到需要修改文件时间属性的需求,比如为了调试或者记录文件状态。这个场景下,我们可以利用Windows API提供的函数来实现。本文将详细介绍如何在VC++中修改文件的时间属性,包括创建...

    修改文件时间属性

    软件名称:修改文件时间属性 英文名称:FileInfoMofidy 一、这是一个用来修改文件或文件夹时间属性(创建时间、修改时间、访问时间)和只读、隐 藏属性的windows桌面工具。所有功能集成在同一界面实现,易于操作和...

    文件时间修改器,可以修改任何文件的时间属性

    在使用"文件时间属性修改.exe"这个程序时,确保你了解操作的法律和道德边界,因为篡改文件时间属性可能在某些场合是非法的,比如在伪造证据或逃避责任的情况下。在个人使用时,确保你有正当的理由并了解可能带来的...

    FileTimeEditor文件时间属性修改神器.zip

    《FileTimeEditor:高效管理文件时间属性的利器》 在日常的计算机操作中,我们经常需要对文件的时间属性进行修改,比如创建时间、修改时间和访问时间。这些时间戳对于文件管理和版本控制至关重要。"FileTimeEditor...

    批量修改文件时间属性

    批量修改文件时间属性是一项高效的操作,尤其对于大量文件时,手动修改会非常耗时。 批量修改文件时间属性通常涉及到编程或使用专门的工具。在Windows操作系统中,可以使用命令行工具`fsutil`或者第三方软件来实现...

    文件时间属性,加密和解密处理程序

    可更改各种文件的时间属性,以及可以把文件加密成其它任意文件,也可将加密文件解密还原,扩展名可任意写...

    文件的属性时间修改器

    然而,需要注意的是,不正确或恶意地修改文件时间属性可能引发安全问题,比如误导用户关于文件的新旧,甚至可能导致数据丢失或破坏。因此,只有在必要和了解潜在风险的情况下,才应使用此类工具。 "FileDate.exe...

    文件时间属性修改工具

    文件时间属性修改工具文件时间属性修改工具

    批量改文件时间属性 v1.0

    【功能】:批量修改指定目录下的所有文件和文件夹的时间属性创建时间属性的修改、最后修改时间属性的修改、最后访问时间属性的修改【使用】:①在第一个文本框里面输入路径,如C有些时候文件的时间属性很重要,为了...

    修改.exe文件的时间属性

    - **法律合规**:在某些司法管辖区,篡改文件时间属性可能违反法律,特别是在涉及电子证据的情况下。 总之,修改.exe文件的时间属性是一项技术性操作,它可以用于多种用途,但同时也可能带来潜在风险。在进行此类...

    文件时间属性修改-NewFileTime-7.15-单文件x86x64二合一版

    NewFileTime是一款小巧、便携、智能、有效的Windows文件时间属性修改软件。

    文件属性时间修改器

    "文件属性时间修改器 V1.0.exe"是一个可执行文件,很可能是一个独立的Windows应用程序,用于修改上述提到的文件时间属性。用户可以通过这个工具选择目标文件,然后自定义设置文件的时间戳。这在某些情况下非常有用,...

    newfiletime3.0修改文件时间属性工具

    NewFileTime中文版是款小巧易用且可以修改文件时间属性的工具。该款软件可以为您提供便捷的更正和操纵时间戳记的任何文件以及文件夹在您system.several文件和/或文件夹。NewFileTime中文版能够修改文件的创建时间、...

    时间属性修改器,可修改任意文件的时间属性

    在IT领域,有时我们需要对文件...总的来说,"时间属性修改器"是一个强大的实用工具,能够满足用户在特定场景下对文件时间属性的调整需求。通过正确理解和使用,它可以帮助我们更有效地管理和调试与时间相关的文件问题。

Global site tag (gtag.js) - Google Analytics