有没有办法删除FILE_FLAG_DELETE_ON_CLOSE?

问题描述 投票:0回答:3

在我的应用程序中,我想使用 FILE_FLAG_DELETE_ON_CLOSE 打开一个临时文件。然而,在某些情况下,临时文件需要保留并且非常大

我想删除打开的句柄上的 FILE_FLAG_DELETE_ON_CLOSE 属性?这可能吗?复制文件的内容或重命名并不是我想要的,我想删除该属性。这是由于我处理一些写入的方式,在我的应用程序中关闭句柄将使我面临竞争条件

file winapi
3个回答
7
投票

你也可以反过来做。 首先打开文件,指定

FILE_SHARE_DELETE
。 然后,当您需要关闭文件时,请使用
FILE_DELETE_ON_CLOSE
再次打开它,然后关闭两个句柄。或者,直接关闭它,它就不会被删除。


5
投票

事实上可以做你想做的事:

  • 使用

    DELETE
    访问权限 (
    0x10000
    ) 打开文件,不使用
    FILE_FLAG_DELETE_ON_CLOSE

  • 使用信息类 SetFileInformationByHandle

     (
    FileDispositionInfo) 和指向
    4
     结构的指针调用 
    FILE_DISPOSITION_INFO
    ,该结构的
    DeleteFile
    成员指示是否应删除文件。 (该结构没有其他成员。)您可以根据需要设置和重置此标志。

如果您在创建时设置

FILE_FLAG_DELETE_ON_CLOSE
,则该标志将被忽略,即使将其设置为
FALSE
也会返回成功代码。我想没有办法取消
FILE_FLAG_DELETE_ON_CLOSE


0
投票

不,一旦创建完成就不可能了。一个危险的想法可能始于这样的声明:“该标志仅与打开链接的句柄相关。”因此,创建一个新链接可能会“修复”它。我思考这个问题的时间不超过五秒钟,但这是午夜时我唯一想到的稍微聪明的事情。

© www.soinside.com 2019 - 2024. All rights reserved.