回答前にこの質問をよく慎重ににお読みください。答えは、それが現れるほどシンプルではありません。.NETのタイムゾーンに関係なく、FAT32ファイルの正しい修正日時を取得する方法を教えてください。
ファイルの変更日時を追跡する必要があるプログラムを作成していますが、その一部は外部FAT32ドライブに保存されています。このプログラムは、さまざまなWindows 7マシンで実行されています。
現在のUTCオフセットが変更されたときに、UTCが変更されたdatetimeの変更になります。具体的には、ニュージーランドの標準時(UTC + 12)からニュージーランドの夏時間(UTC + 13)に戻って再び戻ったときです。これはtypoではありません。UTC変更されたdatetimeの変更。それは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ファイルシステム上にあるかどうかを調べることができ、夏時間の場合は1時間の調整を行いますが、それを動作させることができても恐ろしい醜いハックになります。低レベルのシステムコール作業を使用しますか(問題はOSレベルにあると思われます)マシン全体で変更することなく、プロセスのタイムゾーンを変更できますか?他の方法はありますか?
1つのファイルのLastWriteTimeUtcではなく、2つのファイルのLastWriteTimeUtcの違いをこの問題の回避策として考えてください。 "c:\ a.txt"と "c:\ b.txt"の違いが "\\ backup \ a.txt"と "\\ backup \ b.txt"の違いと異なる場合は、のLastWriteTimeUtc少なくとも1つのファイルが異なります。 – user1027167
あなたが本当に知りたいのは、ファイルが最後に見たときと違う場合です。彼らが巨大ではない場合、あなたはそれらをハッシュすることができます。さらに、タイムスタンプは実際には適切な解決策ではありません。ファイルを読み込んだら競合条件が存在し、同じ時間の間に更新されるためです。 – rsaxvc