簡體   English   中英

無論 .NET 中的時區如何,如何獲得 FAT32 文件的正確修改日期時間?

[英]How do I get the correct modified datetime of a FAT32 file, regardless of timezone in .NET?

在回答之前,請仔細閱讀此問題。 答案並不像看起來那么簡單。

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

問題是當前 UTC 偏移量更改時 UTC 修改日期時間更改。 具體來說,當我們 go 從新西蘭標准時間 (UTC+12) 到新西蘭夏令時 (UTC+13) 並再次返回時。 這不是拼寫錯誤 - UTC修改日期時間更改。 它不應該,這就是 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 文件系統上,如果是夏令時,則進行一小時的調整,但即使我能讓它工作,那也將是一個可怕的丑陋黑客。 使用低級系統調用是否可行(我懷疑不是因為問題似乎出在操作系統級別)? 我可以更改進程的時區,而不在整個機器上更改它嗎? 還有別的辦法嗎?

問題是, FAT32 文件系統將文件時間存儲為本地時間 因此,UTC 時間是將 DST 考慮在內的計算時間,這會導致不同的 UTC 時間。 一般來說,這個問題非常復雜,無法解決。

例如,您需要將真實的 UTC 文件修改時間存儲在一個單獨的文件中,在移除外部驅動器之前,必須在每台機器上同步該文件。 如果同步不會至少執行一次,則不能認為它是正確的。 並且沒有簡單的方法可以向用戶強制執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM