作者:eaglet
轉(zhuǎn)載請注明出處
我所做的系統(tǒng)需要比較文件時間和大小來確定兩個文件是否相同,但在運行過程中,經(jīng)常會發(fā)現(xiàn)文件時間被莫名其妙的修改了1-2秒。這個問題我一直沒有仔細(xì)去研究,一直以為是微軟的一個bug,直到最近發(fā)現(xiàn)這個問題不搞清楚實在是不行了,系統(tǒng)經(jīng)常會從服務(wù)器下載相同的文件。今天仔細(xì)研究了一下這個問題,發(fā)現(xiàn)并不是微軟操作系統(tǒng)的問題,而是文件系統(tǒng)設(shè)計的問題。
直接切入正題
FAT32 文件系統(tǒng)采用FAT表(文件分配表)來存儲文件的索引信息,為了盡量減少FAT表中每個文件占用的空間數(shù)量, FAT32 文件系統(tǒng)將文件大小限制為小于4GB, 文件時間精度限制為2秒,以偶數(shù)對齊。而NTFS文件系統(tǒng)采用的是MFT表(主文件表)來存儲文件的元數(shù)據(jù),這個主文件表相當(dāng)于一個小的數(shù)據(jù)庫,它可以存儲更多的元數(shù)據(jù)。所以NTFS文件系統(tǒng)無論是文件大小還是文件時間精度都遠(yuǎn)遠(yuǎn)高于FAT32. NTFS的文件精度是100ns。
由于兩種文件系統(tǒng)的文件精度不一樣,如果我們把文件從NTFS文件系統(tǒng)拷貝到FAT32文件,由于時間精度不同,文件時間將被強制以偶數(shù)對齊。
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秒。
我們在程序中如果要通過文件時間來判斷文件是否相同,一定要考慮到兩種文件系統(tǒng)的時間誤差的問題,否則會導(dǎo)致系統(tǒng)出現(xiàn)錯誤。另外用MD5 來判斷文件是否相同會更好一些,不過對于大文件,MD5的計算時間會比較長。
參考:
浙公網(wǎng)安備 33010602011771號