ファイルハンドルにデータを書き込んでいるとしましょう:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
データの書き込みに失敗した場合、ハンドルを閉じたときにファイルを削除したい。つまり、ファイルを「un-CreatFile'd」にしたい。
私は明らかなことを試しました。問題があった場合はファイルを削除してください:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
}
catch
{
DeleteFile(filename);
throw;
}
このアプローチには 2 つの問題があります。
- ファイルを閉じた後、削除する前に誰かがファイルを開くことができるという競合状態があります
- ファイルを作成する権限はあるかもしれませんが、削除する権限はありません。
私が望むのは、遡及的に指定する方法です:
FILE_FLAG_DELETE_ON_CLOSE
: ファイルは、すべてのハンドルが閉じられた直後に削除されます。これには、指定されたハンドルと、開いているハンドルまたは重複しているハンドルが含まれます。
私が開いているファイルに。
ファイルを作成しました!確かに私はそれを作成することができます! 事前にフラグを指定するのを忘れたからですか?