2012-04-09 4 views
9

回答前にこの質問をよく慎重ににお読みください。答えは、それが現れるほどシンプルではありません。.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レベルにあると思われます)マシン全体で変更することなく、プロセスのタイムゾーンを変更できますか?他の方法はありますか?

+0

1つのファイルのLastWriteTimeUtcではなく、2つのファイルのLastWriteTimeUtcの違いをこの問題の回避策として考えてください。 "c:\ a.txt"と "c:\ b.txt"の違いが "\\ backup \ a.txt"と "\\ backup \ b.txt"の違いと異なる場合は、のLastWriteTimeUtc少なくとも1つのファイルが異なります。 – user1027167

+0

あなたが本当に知りたいのは、ファイルが最後に見たときと違う場合です。彼らが巨大ではない場合、あなたはそれらをハッシュすることができます。さらに、タイムスタンプは実際には適切な解決策ではありません。ファイルを読み込んだら競合条件が存在し、同じ時間の間に更新されるためです。 – rsaxvc

答えて

8

問題は、FAT32 filesystem stores file time as a local timeです。したがって、UTC時間はDSTを考慮した計算時間であり、異なるUTC時間になります。一般に、この問題は非常に複雑で、解決できません。

たとえば、実際のUTCファイルの変更時刻を別々のファイルに保存する必要があります。これは、外部ドライブを削除する前に各マシンで同期する必要があります。同期が少なくとも1回は実行されない場合、正しいと見なすことはできません。そしてそれをユーザーに強制する簡単な方法はありません。

+6

あまりにも吸うOMG(FAT32)。情報をありがとう。 – TallGuy

+2

@ TallGuy:FAT32システムは、元の* IBM PCの時代から本質的に変更されていない形式でディレクトリエントリを保存します。時代の大部分のマイクロコンピュータには正確な時計がなく、電源が切られている間も日時を維持する方法がないため、時間帯関連の機能は邪魔になりませんでした。ほとんどのユーザー。 – supercat