C99: FILETIME to time_t, _stat и лишний час

Тема в разделе "WASM.WIN32", создана пользователем iZzz32, 23 июн 2008.

  1. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Нужна функция, возвращающая unix timestamp для файла. На WinAPI. RtlTimeToSecondsSince1970 (кстати, как она работает?) использовать не могу, ибо 98:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <time.h>
    4. #include <stdint.h>
    5. #include <sys/stat.h>
    6.  
    7. void foo(char * file, time_t * timestamp)
    8. {
    9.   WIN32_FILE_ATTRIBUTE_DATA fi;
    10.   int64_t           tsWindows;
    11.   const int64_t     tsUnixEpoch = 0x019db1ded53e8000;
    12.  
    13.   *timestamp = 0;
    14.  
    15.   if (GetFileAttributesEx(file, GetFileExInfoStandard, &fi))
    16.   {
    17.     tsWindows = *((int64_t *) &fi.ftLastWriteTime);
    18.     *timestamp = (time_t) ((tsWindows - tsUnixEpoch) / 10000000);  
    19.   }
    20.   return;
    21. }
    22.  
    23. int main(void)
    24. {
    25.   time_t            time_win;
    26.   struct _stat      st;
    27.  
    28.   foo("C:/boot.ini", &time_win);
    29.   _stat("C:/boot.ini", &st);
    30.  
    31.   printf("%ld %ld %ld\n", (long) time_win, (long) st.st_mtime, (long) st.st_mtime - (long) time_win);
    32.   return 0;
    33. }
    Магическая константа получилась так:
    Код (Text):
    1.   SYSTEMTIME        st = {1970, 1, 0, 1, 0, 0, 0, 0};
    2.   FILETIME          ft;
    3.   SystemTimeToFileTime(&st, &ft);
    4.   printf("%#.8lx%.8lx\n", ft.dwHighDateTime, ft.dwLowDateTime);
    Оно даже работает (GCC/TCC/MSVC6), но результат отличается от результата, возвращаемого _stat, на целый час (что-то с daylight saving?). Какой результат правильный, и почему так происходит?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если FAT и файл изменен в "зимнее" время, то возможно, т.к. в отличие от NTFS в FAT сохраняется не UTC, а локальное время создания\изменения файла, а при чтении винда тупо конвертит это время в UTC используя текущее состояние daylight saving.
    см. File Times

    PS: Как ведет себя _stat не знаю. Поэтому попробуй на файле, измененным в "летнее" время, если разница исчезнет, то дело в этом, иначе в чем-то другом