Я работаю над программой, которая записывает метаданные даты из файлов, такие как время создания, время последнего изменения и т. Д. Старая версия программы написана на VBA и выполняет что-то вроде этого:
Public Function GetFileLastAccessTime(ByVal FilePath As String) As Date
Dim fso As New Scripting.FileSystemObject
Dim f As Scripting.File
Set f = fso.GetFile(FilePath)
GetFileLastAccessTime = f.DateLastAccessed
End Function
Вывод для рассматриваемого файла:
?getfilelastaccesstime("SomePath")
7/30/2010 2:16:07 PM
Это значение, которое я получаю из свойств файла в Windows Explorer.Счастье.
Я портирую эту функцию в приложение VB.Net.Новый код:
Public Function GetLastAccessTime(ByVal FilePath As String) As Date
Return IO.File.GetLastAccessTime(FilePath)
End Function
Сама простота.Выход:
?GetLastAccessTime("SomePath")
#7/30/2010 3:16:07 PM#
Через час.
Обе функции работают на одном компьютере, проверяя один и тот же файл.Я также пытался использовать класс IO.FileInfo с тем же результатом.Я проверил тысячи файлов, и все они отключены на один час.Другие свойства даты для времени создания и времени последнего изменения также отключены на один час.
Справка!
Я забыл упомянуть в исходном сообщении, часовой пояс компьютера - CST, а дневной светэкономия времени в настоящее время не действует.
Я воспроизвел проблему в 64-разрядной версии Windows 7 и 32-разрядной версии Windows XP.
Спасибо.
1/6/2011обновление:
Спасибо всем, кто предложил попробовать рассчитать желаемую дату из UTC, используя соответствующие смещения часового пояса.В настоящее время я решаю, что не стоит рисковать.Для этого конкретного бизнес-требования гораздо лучше сказать, что значение даты не соответствует ожидаемому, поскольку именно так работает API.Если я попытаюсь «починить» это, то я им владею, и я бы предпочел этого не делать.
Просто для удовольствия я попытался использовать старый добрый Scripting.FileSystemObject через interop.Он дает ожидаемые результаты, согласующиеся с Windows Explorer, с примерно пятикратным снижением производительности по сравнению с System.IO.Если выяснится, что я должен получить даты, которые совпадают с тем, что есть в Windows Explorer, я укушу пулю и пройду по этому пути.
Еще один эксперимент, который я пытался, заключался непосредственно в функции API GetFileTime в kernel32 через C #:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetFileTime(
IntPtr hFile,
ref FILETIME lpCreationTime,
ref FILETIME lpLastAccessTime,
ref FILETIME lpLastWriteTime
);
Это привело к тому же поведению, что и в System.IO, из-за отключения Windows Explorer на час.
Еще раз спасибо всем.