假设我正在将数据写入文件句柄:
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;
}
这种方法有两个问题:
- 有一个竞争条件,有人可以在我关闭文件后打开我的文件,但在我删除它之前
- 我可能有创建文件的权限,但没有删除它的权限。
我想要的是一种追溯指定的方法:
FILE_FLAG_DELETE_ON_CLOSE
:文件在其所有句柄关闭后立即删除,包括指定的句柄和任何其他打开或重复的句柄。
到我打开的文件。
我创建了文件!我当然可以取消创建它!都是因为我忘了事先指定一个标志?