2011-04-03 31 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