2011-04-03 73 views
0

在FileStream中我有时使用FileOptions.DeleteOnDipose功能,当我调用Dispose()方法时,会自动删除这些文件(如名称所示)。如果我在申请过程中无法决定,我想再次移除标志并保留该文件,该怎么办?在FileStream中重置FileOptions.DeleteOnDispose可能吗?

由于这是来自原始WindowsAPI的功能,我曾在那里看过,但找不到解决方案。

是否有人知道如何重置标志?

感谢 马丁

+0

否,该标志在的CreateFile()调用中使用,它不能被撤回。 – 2011-04-03 13:51:49

+0

为了记录,我相信可以使用NtSetInformationFile来设置FILE_DISPOSITION_INFORMATION信息类(http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/FILE_INFORMATION_CLASS.html#FileDispositionInformation)。这是没有记录的。 – usr 2014-02-08 13:18:53

回答

0

我的话,我会用定期处置和处理文件删除(或不)在finally块。我不知道有什么方法可以重置它。

0

创建文件后无法更改文件标志。您只能更改文件属性。我也看了一下Windows API,只有暴露的方法是SetFileAttributes,它允许你只改变属性。

您应该想出不同的逻辑来完成此操作,例如您想要删除文件时不需要中继到FILE_FLAG_DELETE_ON_CLOSE,您可以自己执行System.IO.File.Delete()

样品:

public class FileStreamEx : System.IO.FileStream 
{ 
    private bool _deleteOnDispose = false; 

    public FileStreamEx(string path, ....) : base(path, ...) { } 

    public bool DeleteOnDispose 
    { 
     get { return _deleteOnDispose; } 
     set { _deleteOnDispose = value; } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (_deleteOnDispose) 
     { 
      System.IO.File.Delete(this.Name); 
     } 

     base.Dispose(disposing); 
    } 
} 
+0

你好,我以前试过这个解决方案,但问题是,如果应用程序被终止,所以没有Finalizers可以运行的文件仍然保存在文件系统中。 DeleteOnDispose属性确保后面的文件被删除。 – msedi 2011-04-05 17:06:50

+0

@Martin Sedlmair:我明白你的问题。最终,你可以做的是当你打开文件,存储它的注册路径,当你关闭文件时,从注册表中删除路径。如果应用程序崩溃,请在下次首次启动时检查注册表中是否存在路径,如果它确实意味着应用程序崩溃,并且您可以删除该文件...(类似这样的内容):-) – HABJAN 2011-04-05 17:14:15

+0

听起来像是一个很好的解决方案。我认为我宁愿保持它的状态并且忍受这个问题。至少这不是一个问题,如果我保留这个文件只是不好。 ;-) – msedi 2011-04-05 21:46:05