事务性 NTFS - 等待 CommitTransaction

Transactional NTFS - wait for CommitTransaction

我正在使用 Transactional NTFS 来原子化对多个文件的多次写入。 问题是提交后,我可能无法重新打开文件, 可能是因为比赛条件。

事件的顺序是:

  1. NTFS 事务是用 CreateTransaction
  2. 创建的
  3. 文件用CreateFileTransacted
  4. 打开
  5. 已完成对文件的写入
  6. 文件关闭 CloseHandle
  7. 交易已提交 CommitTransaction
  8. read/write
  9. CreateFile 重新打开文件

最后一步有时会失败,错误代码为 3: ERROR_PATH_NOT_FOUND - 系统找不到指定的路径。 重新执行程序时,文件就找到了。 这种情况很少发生,但以完全随机的方式发生,这意味着并不总是 重新打开同一文件时。

我的理论是,如果 Windows 终止交易需要很长时间 时间,文件无法以 read/write 模式打开,直到 交易终止。然后我的程序在尝试打开时失败 我自己的文件处于非事务模式。

我认为为了避免这个问题,我需要等待交易 在重新打开文件之前完成。 但是,我还没有找到任何记录在案的方法。

没有聪明的答案,所以我不得不实现自己的虚拟答案:

如果打开刚刚关闭的文件时出现 I/O 错误, 解决方案是在两次调用之间循环打开几次 Sleep() 以释放 CPU,然后确定发生了灾难性错误。

虚拟解决方案,但它解决了问题。