文件在不同文件系统间拷贝文件时间改变的问题
作者:eaglet
转载请注明出处
我所做的系统需要比较文件时间和大小来确定两个文件是否相同,但在运行过程中,经常会发现文件时间被莫名其妙的修改了1-2秒。这个问题我一直没有仔细去研究,一直以为是微软的一个bug,直到最近发现这个问题不搞清楚实在是不行了,系统经常会从服务器下载相同的文件。今天仔细研究了一下这个问题,发现并不是微软操作系统的问题,而是文件系统设计的问题。
直接切入正题
FAT32 文件系统采用FAT表(文件分配表)来存储文件的索引信息,为了尽量减少FAT表中每个文件占用的空间数量, FAT32 文件系统将文件大小限制为小于4GB, 文件时间精度限制为2秒,以偶数对齐。而NTFS文件系统采用的是MFT表(主文件表)来存储文件的元数据,这个主文件表相当于一个小的数据库,它可以存储更多的元数据。所以NTFS文件系统无论是文件大小还是文件时间精度都远远高于FAT32. NTFS的文件精度是100ns。
由于两种文件系统的文件精度不一样,如果我们把文件从NTFS文件系统拷贝到FAT32文件,由于时间精度不同,文件时间将被强制以偶数对齐。
NTFS 时间: 7 hours 31 min 0 sec 000ms.
FAT 时间为: 7 hours 31 min 0 sec 000ms.
NTFS 时间: 7 hours 31 min 0 sec 001ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
NTFS 时间: 7 hours 31 min 1 sec 000ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
NTFS 时间:7 hours 31 min 1 sec 999ms.
FAT32 时间为:7 hours 31 min 2 sec 000ms.
从上面的例子我们可以看出NTFS 到 FAT32 ,文件时间最多会相差2秒。
我们在程序中如果要通过文件时间来判断文件是否相同,一定要考虑到两种文件系统的时间误差的问题,否则会导致系统出现错误。另外用MD5 来判断文件是否相同会更好一些,不过对于大文件,MD5的计算时间会比较长。
参考: