diff options
-rw-r--r-- | src/fios.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/fios.cpp b/src/fios.cpp index 9153c53f1..4e614e498 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -300,13 +300,29 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons FiosItem *fios = file_list.Append(); #ifdef _WIN32 - struct _stat sb; - if (_tstat(OTTD2FS(filename), &sb) == 0) { + // Retrieve the file modified date using GetFileTime rather than stat to work around an obscure MSVC bug that affects Windows XP + HANDLE fh = CreateFile(OTTD2FS(filename), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); + + if (fh != INVALID_HANDLE_VALUE) { + FILETIME ft; + ULARGE_INTEGER ft_int64; + + if (GetFileTime(fh, nullptr, nullptr, &ft) != 0) { + ft_int64.HighPart = ft.dwHighDateTime; + ft_int64.LowPart = ft.dwLowDateTime; + + // Convert from hectonanoseconds since 01/01/1601 to seconds since 01/01/1970 + fios->mtime = ft_int64.QuadPart / 10000000ULL - 11644473600ULL; + } else { + fios->mtime = 0; + } + + CloseHandle(fh); #else struct stat sb; if (stat(filename, &sb) == 0) { -#endif fios->mtime = sb.st_mtime; +#endif } else { fios->mtime = 0; } |