2012-04-09 83 views
9

請在回答之前仔細閱讀本問題並仔細檢查。答案並不像看起來那麼簡單。如何獲得FAT32文件的正確修改日期時間,而不考慮.NET中的時區?

我正在寫一個程序,需要跟蹤文件的修改日期時間,其中一些存儲在外部FAT32驅動器上。該程序正在各種Windows 7機器上運行。

問題是當UTC時差改變時UTC修改日期時間的變化。具體來說,當我們從新西蘭標準時間(UTC + 12)到新西蘭夏令時(UTC + 13)再返回時。這不是拼寫錯誤 - 修改的日期時間更改。它不應該,這是UTC的點,但它確實。這似乎是FAT32文件系統的限制 - NTFS上的文件正常工作。

Console.WriteLine(DateTime.Now.ToString() + (DateTime.Now.IsDaylightSavingTime() ? " Daylight" : " Standard")); 
Console.WriteLine(new FileInfo(args[0]).LastWriteTimeUtc.ToString("yyyyMMdd HH mmss")); 

系統時區是新西蘭,系統日期是2012年4月9日這是新西蘭標準時間。

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt 
2012-04-09 3:53:46 pm Standard 
20120409 03 5316 

現在將系統日期設置爲2012年3月1日這是新西蘭夏令時。請注意,我已重命名包含測試文件的目錄。這很重要,因爲否則Windows將緩存文件的修改日期時間。在我想出來之前,我浪費了很多時間。

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt 
2012-03-01 3:54:13 pm Daylight 
20120409 02 5316 

現在設置系統日期回至2012年4月9日和更改時區阿德萊德(UTC + 09:30)。

C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test3\Test.txt 
2012-04-09 1:27:21 pm Standard 
20120409 06 2316 

那麼我怎樣才能得到正確的修改日期時間?我可以試着弄清楚該文件是否在FAT32文件系統上,如果是夏令時做一個小時的調整,但即使我可以使它工作,這也是一個可怕的醜陋的黑客攻擊。將使用低級系統調用工作(我懷疑不是因爲問題似乎在操作系統級別)?我可以更改過程的時區,而不必在整個機器上進行更改嗎?有沒有其他方法?

+0

此問題的一種可能的解決方法可能是不使用一個文件的LastWriteTimeUtc,而是使用兩個文件的LastWriteTimeUtc的差異。如果「c:\ a.txt」和「c:\ b.txt」的區別與「\\ backup \ a.txt」和「\\ backup \ b.txt」的區別有所不同,那麼LastWriteTimeUtc的at至少有一個文件是不同的。 – user1027167 2014-11-20 15:07:24

+0

這似乎是你真正想知道的是,如果該文件是從你最後一次看到它不同。如果它們不是很大,你可以把它們打散。另外,無論如何,時間戳並不是真正的解決方案,因爲如果您閱讀文件並在同一時間段內更新文件,那麼存在競爭條件。 – rsaxvc 2015-01-02 19:49:16

回答

8

問題是,FAT32 filesystem stores file time as a local time。因此,UTC時間是一個計算時間,它考慮到了DST,這導致了不同的UTC時間。一般來說,這個問題非常複雜,無法解決。

例如,您需要將實際的UTC文件修改時間存儲在單獨的文件中,該文件必須在移除外部驅動器之前在每臺計算機上進行同步。如果同步不會被執行至少一次,那麼它不會被認爲是正確的。並沒有簡單的方法來強制執行這個給用戶。

+6

太吸吮的OMG(FAT32)。謝謝(你的)信息。 – TallGuy 2012-04-10 07:59:43

+2

@TallGuy:FAT32系統以自IBM * PC *以來基本不變的格式存儲目錄條目。考慮到這個時代的大多數微型計算機沒有任何準確的時鐘,並且即使PC沒有任何方法來保持關機時的日期和時間,與時區相關的功能也只不過是一種麻煩大多數用戶。 – supercat 2013-12-09 23:23:35

相關問題