在FileStream中我有時使用FileOptions.DeleteOnDipose功能,當我調用Dispose()方法時,會自動刪除這些文件(如名稱所示)。如果我在申請過程中無法決定,我想再次移除標誌並保留該文件,該怎麼辦?在FileStream中重置FileOptions.DeleteOnDispose可能嗎?
由於這是來自原始WindowsAPI的功能,我曾在那裏看過,但找不到解決方案。
是否有人知道如何重置標誌?
感謝 馬丁
在FileStream中我有時使用FileOptions.DeleteOnDipose功能,當我調用Dispose()方法時,會自動刪除這些文件(如名稱所示)。如果我在申請過程中無法決定,我想再次移除標誌並保留該文件,該怎麼辦?在FileStream中重置FileOptions.DeleteOnDispose可能嗎?
由於這是來自原始WindowsAPI的功能,我曾在那裏看過,但找不到解決方案。
是否有人知道如何重置標誌?
感謝 馬丁
我的話,我會用定期處置和處理文件刪除(或不)在finally
塊。我不知道有什麼方法可以重置它。
創建文件後無法更改文件標誌。您只能更改文件屬性。我也看了一下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);
}
}
你好,我以前試過這個解決方案,但問題是,如果應用程序被終止,所以沒有Finalizers可以運行的文件仍然保存在文件系統中。 DeleteOnDispose屬性確保後面的文件被刪除。 – msedi 2011-04-05 17:06:50
@Martin Sedlmair:我明白你的問題。最終,你可以做的是當你打開文件,存儲它的註冊路徑,當你關閉文件時,從註冊表中刪除路徑。如果應用程序崩潰,請在下次首次啓動時檢查註冊表中是否存在路徑,如果它確實意味着應用程序崩潰,並且您可以刪除該文件...(類似這樣的內容):-) – HABJAN 2011-04-05 17:14:15
聽起來像是一個很好的解決方案。我認爲我寧願保持它的狀態並且忍受這個問題。至少這不是一個問題,如果我保留這個文件只是不好。 ;-) – msedi 2011-04-05 21:46:05
否,該標誌在的CreateFile()調用中使用,它不能被撤回。 – 2011-04-03 13:51:49
爲了記錄,我相信可以使用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