CreateFile 難しい

ただ単に

  1. ファイルを読み込む(CreateFile ⇒ GetFileSize ⇒ CreateFileMapping ⇒ MapViewOfFile ⇒ UnmapViewOfFile ⇒ CloseHandle(map) ⇒ CloseHandle(file))
  2. ファイルの内容をオンメモリで変更
  3. 同じファイルに書き出す(CreateFile ⇒ WriteFile ⇒ CloseHandle)

ということをしたいだけなのに、3 を行うときの CreateFile でまれに失敗してしまう。
頻度としては 2000 回に 1 回というところか。

1 〜 3 への処理は同一スレッドで時間軸に沿って処理されるので、1 の処理のハンドルが閉じられていないということはありえないはずだけど、詳細エラーでは「別のプロセスが使ってる」ということで、原因は 1 の処理が終わっていないから 3 に失敗するのだと思う。

処理の流れやエラーハンドリングには問題ないので、後は CreateFile のパラメータをいろいろ変えて試してみるということを延々とやってるんだけど、再現頻度が低すぎて、改善されたんだかされてないんだか判明するのに非常に時間がかかる。

      • -

2008/10/17 追記:

結局、以下のように回避するようにした。

HANDLE file1;
for (int i = 0; i < 3; i++) {
    file1 = CreateFile(save_path, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (file1 == INVALID_HANDLE_VALUE) {
        Sleep(20); // ちょっと待てば開けるようになる可能性が高い
    } else {
        break;
    }
}
if (file1 == INVALID_HANDLE_VALUE) {
    // エラー処理
}

この対応で 5 万回ぐらいテストして、3 回続けて失敗することはなかったので、これでいいかな、と。