私は、これはWindows Internalsで覆われていると信じています。短所は、ファイルハンドルでCloseHandleを呼び出したとしても、カーネルには数ミリ秒かかる閉じた参照が残っている可能性があるということです。
ファイルを削除するより確実な方法は、最後のハンドルを開くときにFILE_FLAG_DELETE_ON_CLOSEフラグを使用することです。これは、読み取り/書き込みの間にファイルを閉じるのを避けることができればさらに効果的です。
#include <windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t** argv)
{
LPCWSTR fileName = L"c:\\temp\\test1234.bin";
HANDLE h1 = CreateFileW(
fileName,
GENERIC_WRITE,
// make sure the next call to CreateFile can succeed if this handle hasn't been closed yet
FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_TEMPORARY,
NULL);
if (h1 == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "h1 failed: 0x%x\n", GetLastError());
return GetLastError();
}
HANDLE h2 = CreateFileW(
fileName,
GENERIC_READ,
// FILE_SHARE_WRITE is required in case h1 with GENERIC_WRITE access is still open
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
// tell the OS to delete the file as soon as it is closed, no DeleteFile call needed
FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_TEMPORARY,
NULL);
if (h2 == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "h2 failed: 0x%x\n", GetLastError());
return GetLastError();
}
return 0;
}
あなたはそれを削除しようとする前に、適切にファイルを閉じていますか?あなたはどんなハンドルも見逃しましたか? – RageZ
私が言ったように、私はWinInternalsツールでそれをチェックしました。すべてのオープンはクローズとペアになっていますが、削除は失敗します。 1秒間スリープ状態にすると問題が解決します。 –
窓がバギーかもしれませんが、私はそれについて疑問に思っています。 'sleep'を追加するとうまくいくはずです^^ – RageZ