請在回答之前仔細閱讀本問題並仔細檢查。答案並不像看起來那麼簡單。如何獲得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文件系統上,如果是夏令時做一個小時的調整,但即使我可以使它工作,這也是一個可怕的醜陋的黑客攻擊。將使用低級系統調用工作(我懷疑不是因爲問題似乎在操作系統級別)?我可以更改過程的時區,而不必在整個機器上進行更改嗎?有沒有其他方法?
此問題的一種可能的解決方法可能是不使用一個文件的LastWriteTimeUtc,而是使用兩個文件的LastWriteTimeUtc的差異。如果「c:\ a.txt」和「c:\ b.txt」的區別與「\\ backup \ a.txt」和「\\ backup \ b.txt」的區別有所不同,那麼LastWriteTimeUtc的at至少有一個文件是不同的。 – user1027167 2014-11-20 15:07:24
這似乎是你真正想知道的是,如果該文件是從你最後一次看到它不同。如果它們不是很大,你可以把它們打散。另外,無論如何,時間戳並不是真正的解決方案,因爲如果您閱讀文件並在同一時間段內更新文件,那麼存在競爭條件。 – rsaxvc 2015-01-02 19:49:16