gpt4 book ai didi

winapi - 如何取消创建文件

转载 作者:行者123 更新时间:2023-12-02 06:52:35 24 4
gpt4 key购买 nike

假设我正在将数据写入文件句柄:

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;
}

这种方法有两个问题:

  1. 存在竞争条件,即有人可以在我关闭文件后但在我删除它之前打开我的文件
  2. 我可能有权创建文件,但无权删除文件。

我想要的是一种追溯指定的方法:

FILE_FLAG_DELETE_ON_CLOSE: The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.

到我打开的文件。

我创建了这个文件!我当然可以取消它!都是因为我忘记事先指定一个标志?

最佳答案

在所有版本的 Windows 中,您都可以

  1. 最初打开文件时指定FILE_SHARE_DELETE
  2. 再次打开它,并指定FILE_FLAG_DELETE_ON_CLOSE
  3. 关闭第二个 handle 。
  4. 当所有句柄关闭时,该文件将被删除。

CreateFile 文档中的 FILE_FLAG_DELETE_ON_CLOSE 描述对此进行了解释:

The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles. If there are existing open handles to a file, the call fails unless they were all opened with the FILE_SHARE_DELETE share mode.

<小时/>

如果自动删除不够好,您可以研究事务性 NTFS,将文件创建和所有写入放入事务中,然后在必要时回滚。

关于winapi - 如何取消创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com