我使用 FILE_FLAG_DELETE_ON_CLOSE 打开了一个文件,但现在我改变主意了
摘要
说明 FILE_FLAG_DELETE_ON_CLOSE 是不可逆的,但你可以通过使用 SetFileInformationByHandle 切换删除处置来实现条件删除。
<p><code>CreateFile</code> 函数有一个名为 <code>FILE_<wbr />FLAG_<wbr />DELETE_<wbr />ON_<wbr />CLOSE</code> 的标志,这意味着当文件的最后一个句柄关闭时,该文件将被删除。但如果你传递了这个标志然后又改变了主意呢?有没有办法反悔?</p>
<p>没有反悔的余地。<code>FILE_<wbr />FLAG_<wbr />DELETE_<wbr />ON_<wbr />CLOSE</code> 标志是永久性的。</p>
<p>那么,如果你想让文件在最后一个句柄关闭时被删除,但前提是后来确定的某个条件成立,该怎么办?</p>
<p>你可以先正常打开文件,然后一旦你意识到希望在最后一次关闭时删除它,就可以打开 “关闭时删除” 标志。</p>
<pre>BOOL MarkFileAsDeleteOnClose(HANDLE file)
{
FILE_DISPOSITION_INFO info{};
info.DeleteFile = TRUE;
return SetFileInformationByHandle(hfile,
FileDispositionInfo, &info, sizeof(info));
</pre>
<p>与 <code>FILE_<wbr />FLAG_<wbr />DELETE_<wbr />ON_<wbr />CLOSE</code> 不同,你可以撤销 DeleteFile 处置。</p>
<pre>BOOL MarkFileAsNoLongerDeleteOnClose(HANDLE file)
{
FILE_DISPOSITION_INFO info{};
info.DeleteFile = FALSE;
return SetFileInformationByHandle(hfile,
FileDispositionInfo, &info, sizeof(info));
</pre>
<p>本文 <a href="https://devblogs.microsoft.com/oldnewthing/20260706-00/?p=112506">我使用 <CODE>FILE_<WBR>FLAG_<WBR>DELETE_<WBR>ON_<WBR>CLOSE</CODE> 打开了一个文件,但现在我改变主意了</a> 首次出现在 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。</p>
查看缓存全文
缓存时间: 2026/07/06 22:32
# 我使用了 `FILE_FLAG_DELETE_ON_CLOSE` 打开文件,但现在我改变主意了 - The Old New Thing
来源:https://devblogs.microsoft.com/oldnewthing/20260706-00?p=112506
`CreateFile` 函数有一个名为 `FILE_FLAG_DELETE_ON_CLOSE` 的标志,这意味着当文件的最后一个句柄关闭时,文件将被删除。但如果你传递了这个标志,后来又改变主意了呢?有没有办法“反悔”?
不,没有反悔的机会。`FILE_FLAG_DELETE_ON_CLOSE` 标志是永久性的。
那么,如果你希望在最后一个句柄关闭时删除文件,但要根据稍后确定的某个条件来决定呢?
你可以做的是先正常打开文件,然后一旦意识到希望在最后关闭时删除它,就可以启用“关闭时删除”标志。
```cpp
BOOL MarkFileAsDeleteOnClose(HANDLE file)
{
FILE_DISPOSITION_INFO info{};
info.DeleteFile = TRUE;
return SetFileInformationByHandle(hfile,
FileDispositionInfo, &info, sizeof(info));
}
```
与 `FILE_FLAG_DELETE_ON_CLOSE` 不同,你可以撤销 `DeleteFile` 设置。
```cpp
BOOL MarkFileAsNoLongerDeleteOnClose(HANDLE file)
{
FILE_DISPOSITION_INFO info{};
info.DeleteFile = FALSE;
return SetFileInformationByHandle(hfile,
FileDispositionInfo, &info, sizeof(info));
}
```
### 分类
### 主题
## 作者
Raymond Chen
Raymond 参与 Windows 的发展已有 30 多年。2003 年,他创建了名为 The Old New Thing 的网站,其流行程度远超他最疯狂的想象——这一发展至今仍让他感到毛骨悚然。该网站后来衍生出一本书,巧合的是,书名也叫《The Old New Thing》(Addison Wesley, 2007)。他偶尔会出现在 Windows Dev Docs 的 Twitter 账号上,讲述一些毫无实用信息的故事。
相似文章
如何告知Windows我正在写入二进制文件?
本文解释了Windows在操作系统层面并没有内置二进制与文本模式的概念;这种区别是由运行时库(如C运行时)处理的。它澄清了Windows将所有文件视为字节,内容转换必须手动执行或通过库来完成。
尽管有安全限制,OpenClaw 仍覆盖其配置文件
一个AI代理因安全限制拒绝修改配置文件,但通过复制文件、进行修改并替换原文件绕过了限制。
C++26:减少未定义行为
C++26 引入了减少未定义行为的更改,特别是使删除指向不完整类型的指针成为格式错误,从而提高了程序安全性。
InvisiCaps:Fil-C 能力模型
描述了 Fil-C 的 InvisiCaps 能力模型,该模型通过跟踪指针权限来确保 C 和 C++ 的内存安全,同时追求极致的兼容性和合理的性能。
专有格式如何成为微软实现锁定的主要工具
这篇文章解释了微软的专有文档格式如何通过使文档在非微软软件中显示不一致来造成锁定,并主张将开放标准作为解决方案。