如何在C++17中将std::filesystem::file_time_type转换为FILETIME?
C17/C11 转换 std::filesystem::file_time_type 到 FILETIME
C++17 原生实现
std::filesystem::file_time_type 基于 Unix 纪元(1970年1月1日),而 FILETIME 以1601年1月1日为起点,单位是100纳秒。转换核心是计算两个纪元的时间差,再将文件时间偏移到FILETIME的时间轴上:
#include <filesystem> #include <chrono> #include <cstdint> #include <windows.h> FILETIME file_time_to_FILETIME(const std::filesystem::file_time_type& file_time) { // 1601年1月1日到1970年1月1日的100纳秒间隔总数 constexpr uint64_t epoch_offset = 11644473600ULL * 10000000ULL; // 将文件时间转换为100纳秒为单位的计数(相对于Unix纪元) auto time_since_unix_epoch = file_time.time_since_epoch(); uint64_t file_time_100ns = std::chrono::duration_cast< std::chrono::duration<uint64_t, std::ratio<1, 10000000>> >(time_since_unix_epoch).count(); // 计算FILETIME对应的总100纳秒数 uint64_t total_100ns = epoch_offset + file_time_100ns; // 拆分64位值到FILETIME的两个32位字段 FILETIME ft{}; ft.dwLowDateTime = static_cast<DWORD>(total_100ns); ft.dwHighDateTime = static_cast<DWORD>(total_100ns >> 32); return ft; }
C++11 兼容方案
C++11 没有原生的 std::filesystem,通常使用 boost::filesystem 替代。以下是基于 boost::posix_time::ptime 的转换实现:
#include <boost/filesystem.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <cstdint> #include <windows.h> FILETIME boost_file_time_to_FILETIME(const boost::posix_time::ptime& file_time) { constexpr uint64_t epoch_offset = 11644473600ULL * 10000000ULL; // 计算文件时间与Unix纪元的时间差 const auto unix_epoch = boost::posix_time::from_time_t(0); auto time_diff = file_time - unix_epoch; // 转换为100纳秒单位的计数 uint64_t total_seconds = time_diff.total_seconds(); uint64_t fractional_100ns = time_diff.fractional_seconds() * 100; // 微秒转100纳秒 uint64_t file_time_100ns = total_seconds * 10000000ULL + fractional_100ns; uint64_t total_100ns = epoch_offset + file_time_100ns; FILETIME ft{}; ft.dwLowDateTime = static_cast<DWORD>(total_100ns); ft.dwHighDateTime = static_cast<DWORD>(total_100ns >> 32); return ft; }
关键说明
- 两种转换均基于UTC时间,无需额外时区转换
- 使用
uint64_t避免溢出问题,确保覆盖现代文件时间范围 - C++17实现依赖
<filesystem>头文件,编译时可能需要链接对应库(如MSVC需/std:c++17并链接filesystem.lib)
内容的提问来源于stack exchange,提问作者Lion Butcher
相关产品推荐
相关产品推荐

