调用fs::last_write_time读取时触发文件已存在创建错误排查
问题原因分析:
std::filesystem::last_write_time读取时触发「文件已存在无法创建」异常 Windows平台API版本与实现差异
C++标准库的std::filesystem::last_write_time读取操作在Windows底层依赖Win32 API。Windows Server 2019的底层API存在兼容性问题:即便只是读取文件时间,当文件被独占锁定时,底层逻辑仍可能触发需要写入权限的操作(比如临时元数据写入尝试);而Win11的API已优化该场景,只读操作仅请求必要的读取权限,不会触发此类异常。文件独占写入的锁冲突
当目标文件被其他程序以独占写入模式循环打开时,Server 2019上的底层API无法获取足够的文件访问权限,标准库将底层的权限错误错误映射为「Cannot create a file when that file already exists」异常——这是错误码映射不精准导致的误导性提示,本质是文件访问权限不足,而非真的要创建已存在的文件。验证与解决方向
- 先测试Server 2019环境下,文件未被其他程序写入时调用
last_write_time是否正常,确认问题仅出现在文件被独占写入的场景。 - 检查写入文件的程序,确认其打开文件时是否设置了
FILE_SHARE_READ标志(允许其他进程读取文件元数据),若未设置则修改写入程序的文件打开参数。 - 绕过C++标准库封装,直接调用Win32 API
GetFileTime获取文件修改时间,避免标准库的错误码映射和不必要的内部操作。
- 先测试Server 2019环境下,文件未被其他程序写入时调用
内容的提问来源于stack exchange,提问作者ycomp
相关产品推荐
相关产品推荐

