我使用 FILE_FLAG_DELETE_ON_CLOSE 打开了一个文件,但现在我改变主意了

The Old New Thing (Raymond Chen) 工具

摘要

说明 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>你可以先正常打开文件,然后一旦你意识到希望在最后一次关闭时删除它,就可以打开 &#8220;关闭时删除&#8221; 标志。</p> <pre>BOOL MarkFileAsDeleteOnClose(HANDLE file) { FILE_DISPOSITION_INFO info{}; info.DeleteFile = TRUE; return SetFileInformationByHandle(hfile, FileDispositionInfo, &amp;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, &amp;info, sizeof(info)); </pre> <p>本文 <a href="https://devblogs.microsoft.com/oldnewthing/20260706-00/?p=112506">我使用 &lt;CODE&gt;FILE_&lt;WBR&gt;FLAG_&lt;WBR&gt;DELETE_&lt;WBR&gt;ON_&lt;WBR&gt;CLOSE&lt;/CODE&gt; 打开了一个文件,但现在我改变主意了</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我正在写入二进制文件?

The Old New Thing (Raymond Chen)

本文解释了Windows在操作系统层面并没有内置二进制与文本模式的概念;这种区别是由运行时库(如C运行时)处理的。它澄清了Windows将所有文件视为字节,内容转换必须手动执行或通过库来完成。

C++26:减少未定义行为

Lobsters Hottest

C++26 引入了减少未定义行为的更改,特别是使删除指向不完整类型的指针成为格式错误,从而提高了程序安全性。

InvisiCaps:Fil-C 能力模型

Lobsters Hottest

描述了 Fil-C 的 InvisiCaps 能力模型,该模型通过跟踪指针权限来确保 C 和 C++ 的内存安全,同时追求极致的兼容性和合理的性能。