Codechange: Replace platform-specific calls with std::filesystem::last_write_time. (#12487)

This commit is contained in:
Peter Nelson 2024-04-15 19:10:19 +01:00 committed by GitHub
parent f5a50a874f
commit a1b03ee69e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 30 deletions

View File

@ -21,10 +21,7 @@
#include "tar_type.h"
#include <sys/stat.h>
#include <charconv>
#ifndef _WIN32
# include <unistd.h>
#endif /* _WIN32 */
#include <filesystem>
#include "table/strings.h"
@ -53,7 +50,7 @@ bool FiosItem::operator< (const FiosItem &other) const
int r = false;
if ((_savegame_sort_order & SORT_BY_NAME) == 0 && (*this).mtime != other.mtime) {
r = this->mtime - other.mtime;
r = ClampTo<int32_t>(this->mtime - other.mtime);
} else {
r = StrNaturalCompare((*this).title, other.title);
}
@ -291,32 +288,13 @@ bool FiosFileScanner::AddFile(const std::string &filename, size_t, const std::st
}
FiosItem *fios = &file_list.emplace_back();
#ifdef _WIN32
// 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).c_str(), 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.c_str(), &sb) == 0) {
fios->mtime = sb.st_mtime;
#endif
} else {
std::error_code error_code;
auto write_time = std::filesystem::last_write_time(OTTD2FS(filename), error_code);
if (error_code) {
fios->mtime = 0;
} else {
fios->mtime = std::chrono::duration_cast<std::chrono::milliseconds>(write_time.time_since_epoch()).count();
}
fios->type = type;

View File

@ -78,7 +78,7 @@ extern LoadCheckData _load_check_data;
/** Deals with finding savegames */
struct FiosItem {
FiosType type;
uint64_t mtime;
int64_t mtime;
std::string title;
std::string name;
bool operator< (const FiosItem &other) const;