Windows下的文件时间分为三种:创建时间、最后一次修改时间、最后一次访问时间,文件夹(目录)和文件一样,也有这三种时间,除此之外,还有个MFT修改时间,这个我们一般用不到,在此不谈。不过,在Windows资源管理器(或文件管理器)里,通过查看属性只能看到文件夹的创建时间,看不到另外两个。
创建时间,顾名思义是指系统建立文件的时间,是系统通过CreateFile函数创建文件的时间,创建之后,文件创建时间就不会再改变。修改时间,是系统最后一次调用WriteFile对目标文件进行改写的时间,只要调用WriteFile成功,就算文件内容没有发生变化,文件的修改时间也依旧会改变。前两种我们都好理解,然而访问时间是什么呢?很多人可能不知道,以为是打开文件的时间,或是读取文件的时间,要是这样它就和修改时间就没什么太大的区别了,其实访问时间也是创建时间的一种,确切地说,文件的最后访问时间是文件的“物理创建时间”,或者说是在不同的分区下创建文件的时间。在NTFS分区,当一个文件在同一分区下面移动时,这个文件的物理位置其实并没有发生变化,变的只是MFT(主文件表)里的记录,也就是指向此文件的链接或路径变了,所以在同一分区下面移动文件一般是瞬间完成的,而在不同分区下面移动文件时,系统就必须在新的分区重新在MFT中为该文件建一条记录,之后再把原MFT中的创建时间登记在新分区的文件表中,所以我们说,所谓创建时间,其实是逻辑上的时间,但该文件在物理上确实被重新建立了数据,所以就取名“访问时间”。所以,所谓访问时间,就是指该文件在新分区创建的时间,当一个文件移动到了另一个分区,它的访问时间就会发生变化。通过查看访问时间,我们可以知道文件是否被移动过(物理上的移动或不同分区之间的移动,同一分区下面移动不算),一个C盘下的文件,如果文件创建时间和访问时间相同,则说明文件自创建以来,没有离开过C盘,如果它移动到D盘再移动回来,访问时间自然就会改变。
排除第三方软件和系统时间的作用,一个文件刚被创建时,三个时间是一样的,当它移动到另一个位置后,创建时间和修改时间不变,访问时间可变可不变;当它复制到另一个位置后,创建时间和访问时间改变,修改时间仍然不变。反之可推,三时间相同,说明文件自创建后没有被复制、改写和移动(不同分区);修改时间大于创建时间,文件一定被修改过,修改时间小于创建时间,文件一定被复制过,访问时间大于创建时间,文件一定被移动过。
文件夹的时间和文件稍有不同,首先文件夹不能离开它所在的分区,复制或移动到另一分区,创建时间就会发生改变,其次,文件夹的修改时间是指它的目录里面最后一次进行创建、删除、重命名等操作的时间,如果在它里面创建其它文件或文件夹,或者改变目录内的文件名,移走其中一个文件或目录,它的修改时间和访问时间都会发生变化,在这一点上,文件夹的修改时间和访问时间似乎是一样的。不过,只有子目录的改变才是有效的,如果是子目录的子目录则对该目录而言,改变的不是它,而是它的子目录。对于文件夹而言,若三时间相同,如果是空文件夹则说明它被创建后里面从没有放进去过东西,如果里面有文件或文件夹,则说明它一定是被复制过的,而且从复制后就再也没有改动过里面的东西(创建、删除、移走或重命名)。如果创建时间和修改时间不一致,说明文件夹被改动过。
要修改文件时间,除了用软件,其实我们可以自己解决,比如改变创建时间,首先把系统时间调整到接近那个时间,然后等快到时间时,快速复制一个副本即可,不过要首先看下文件大小,然后根据它的大小确定什么时候开始复制,复制后再删除源文件,这样就相当于间接改变了文件的创建时间。改变修改时间的话,如果文件是文本之类好办,如果是其它格式如EXE等,就不行了,只能用软件来实现。访问时间前面说过了,同样还是先调整系统时间,然后把目标文件复制到另一个盘,等时间到了立即复制回来。另外,文件时间是精确到毫秒(ms)的,如果要对比两个文件的时间是否相同等,就要用到第三方软件了,方法就是使用CompareFileTime这个系统API。