Skip to content

Commit

Permalink
[Windows] Use GetFileTime for FileAccess
Browse files Browse the repository at this point in the history
Prevents DST from rearranging file times.
  • Loading branch information
AThousandShips committed Sep 6, 2024
1 parent 05d9854 commit 7139f46
Showing 1 changed file with 32 additions and 7 deletions.
39 changes: 32 additions & 7 deletions drivers/windows/file_access_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,15 +412,40 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) {
file = file.substr(0, file.length() - 1);
}

struct _stat st;
int rv = _wstat((LPCWSTR)(file.utf16().get_data()), &st);
HANDLE handle = CreateFileW((LPCWSTR)(file.utf16().get_data()), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr);

if (rv == 0) {
return st.st_mtime;
} else {
print_verbose("Failed to get modified time for: " + p_file + "");
return 0;
if (handle != INVALID_HANDLE_VALUE) {
FILETIME ft_create, ft_write;

bool status = GetFileTime(handle, &ft_create, nullptr, &ft_write);

CloseHandle(handle);

if (status) {
uint64_t ret = 0;

// If write time is invalid, fallback to creation time.
if (ft_write.dwHighDateTime == 0 && ft_write.dwLowDateTime == 0) {
ret = ft_create.dwHighDateTime;
ret <<= 32;
ret |= ft_create.dwLowDateTime;
} else {
ret = ft_write.dwHighDateTime;
ret <<= 32;
ret |= ft_write.dwLowDateTime;
}

const uint64_t WINDOWS_TICKS_PER_SECOND = 10000000;
const uint64_t TICKS_TO_UNIX_EPOCH = 116444736000000000LL;

if (ret >= TICKS_TO_UNIX_EPOCH) {
return (ret - TICKS_TO_UNIX_EPOCH) / WINDOWS_TICKS_PER_SECOND;
}
}
}

print_verbose("Failed to get modified time for: " + p_file);
return 0;
}

BitField<FileAccess::UnixPermissionFlags> FileAccessWindows::_get_unix_permissions(const String &p_file) {
Expand Down

0 comments on commit 7139f46

Please sign in to comment.