diff --git a/support/src/utils/file.cpp b/support/src/utils/file.cpp index 84d8a745..579c2182 100644 --- a/support/src/utils/file.cpp +++ b/support/src/utils/file.cpp @@ -180,28 +180,33 @@ auto get_times(std::string_view path) -> std::optional { std::string{path}.c_str(), GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr); - if (file_handle == INVALID_HANDLE_VALUE) { - throw std::runtime_error("failed to open file to get file times|" + - std::string{path} + '|' + - std::to_string(utils::get_last_error_code())); + if (file_handle != INVALID_HANDLE_VALUE) { + std::array times{}; + auto res = ::GetFileTime(file_handle, ×.at(0U), ×.at(1U), + ×.at(2U)); + ::CloseHandle(file_handle); + if (res) { + ret.accessed = + utils::time::windows_file_time_to_unix_time(times.at(1U)); + ret.created = utils::time::windows_file_time_to_unix_time(times.at(0U)); + ret.modified = + utils::time::windows_file_time_to_unix_time(times.at(2U)); + ret.written = utils::time::windows_file_time_to_unix_time(times.at(2U)); + return ret; + } } - std::array times{}; - auto res = - ::GetFileTime(file_handle, ×.at(0U), ×.at(1U), ×.at(2U)); - ::CloseHandle(file_handle); - - if (not res) { + struct _stat64 st {}; + if (_stat64(std::string{path}.c_str(), &st) != 0) { throw std::runtime_error("failed to get file times|" + std::string{path} + - '|' + - std::to_string(utils::get_last_error_code())); + '|' + std::to_string(errno)); } - ret.accessed = utils::time::windows_file_time_to_unix_time(times.at(1U)); - ret.created = utils::time::windows_file_time_to_unix_time(times.at(0U)); - ret.modified = utils::time::windows_file_time_to_unix_time(times.at(2U)); - ret.written = utils::time::windows_file_time_to_unix_time(times.at(2U)); -#else // !defined(_WIN32) + ret.accessed = utils::time::windows_time_t_to_unix_time(st.st_atime); + ret.created = utils::time::windows_time_t_to_unix_time(st.st_ctime); + ret.modified = utils::time::windows_time_t_to_unix_time(st.st_mtime); + ret.written = utils::time::windows_time_t_to_unix_time(st.st_mtime); +#else // !defined(_WIN32) struct stat64 st {}; if (stat64(std::string{path}.c_str(), &st) != 0) { throw std::runtime_error("failed to get file times|" + std::string{path} + @@ -220,6 +225,7 @@ auto get_times(std::string_view path) -> std::optional { ret.written = static_cast(st.st_mtim.tv_nsec) + static_cast(st.st_mtim.tv_sec) * utils::time::NANOS_PER_SECOND; + #endif // defined(_WIN32) return ret;