Jak uzyskać poprawną zmodyfikowaną datę i godzinę pliku FAT32, niezależnie od strefy czasowej w .NET?

Przeczytaj to pytaniew pełni i ostrożnie przed odebraniem Odpowiedź nie jest tak prosta, jak mogłoby się wydawać.

Piszę program, który musi śledzić zmodyfikowaną datę i godzinę plików, z których niektóre są przechowywane na zewnętrznym dysku FAT32. Program jest uruchamiany na różnych komputerach z systemem Windows 7.

Problem polega na tym, że zmieniona data i godzina modyfikacji UTC zmieniają się wraz z przesunięciem bieżącego UTC. W szczególności, kiedy przechodzimy z czasu nowozelandzkiego standardowego (UTC + 12) do czasu letniego Nowej Zelandii (UTC + 13) iz powrotem. To nie jest literówka -UTC zmodyfikowane zmiany datetime. To nie powinno być, to jest punkt UTC, ale tak jest. To wydaje się być ograniczeniem systemu plików FAT32 - pliki na NTFS działają poprawnie.

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

Strefa czasowa systemu to Nowa Zelandia, a data systemowa to 9 kwietnia 2012 r., Czyli czas nowozelandzki.

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

Teraz ustaw datę systemu na 1 marca 2012 r., Czyli czas letni Nowej Zelandii. Zauważ, że zmieniłem nazwę katalogu zawierającego plik testowy. To ważne, bo inaczejWindows buforuje zmodyfikowany datetime pliku. Wiele czasu zmarnowałem, zanim się zorientowałem.

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

Teraz ustaw system na 9 kwietnia 2012 i zmień strefę czasową na Adelajdę (UTC + 09: 30).

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

Jak więc uzyskać poprawny zmodyfikowany datetime? Mógłbym spróbować ustalić, czy plik jest w systemie plików FAT32 i czy jest czas letni, dokonać korekty przez godzinę, ale nawet gdybym mógł go uruchomić, byłby to okropny brzydki hack. Czy korzystanie z niskiego poziomu wywołań systemowych zadziała (podejrzewam, że nie dlatego, że problem występuje na poziomie systemu operacyjnego)? Czy mogę zmienić strefę czasową procesu, nie zmieniając go na całej maszynie? Czy jest jakiś inny sposób?

questionAnswers(1)

yourAnswerToTheQuestion