這是一個有趣的想法,但也有一些關於這個設計,困擾我。請原諒我,如果你已經在你的設計中解決了這個問題。但是如果你的設計只是一個簡單的包裝FileStream
,那麼我認爲這是一個微妙的問題,但這是一個重大的問題。
如果你刪除文件時流被關閉,這意味着實際使用該文件中的數據是唯一的出路,如果FileAccess
是ReadWrite
。正確?換句話說,你將使用的代碼看起來像這樣的文件:
using (TempFileStream t as new TempFileStream())
{
WriteDataToTempFile(t);
t.Seek(0, SeekOrigin.Begin);
ReadDataFromTempFile(t);
}
我看到的問題是,ReadDataFromTempFile
期待文件進行讀取訪問被打開,而不是讀/寫訪問。這爲我認爲很難找到的一些錯誤打開了大門。考慮這樣的代碼:
using (TempFileStream t as new TempFileStream())
{
MyClass o = new MyClass(o);
o.TempStream = t;
o.ProduceOutput();
t.Seek(0, SeekOrigin.Begin);
o.ProcessOutput();
}
...當這種比較:
MyClass o = new MyClass();
string n = Path.GetTempFileName();
using (FileStream s = new FileStream(n, FileMode.Create, FileAccess.Write))
{
o.TempStream = t;
o.ProduceOutput();
}
using (FileStream s = new FileStream(n, FileMode.Open, FileAccess.Read))
{
o.TempStream = t;
o.ProcessOutput();
}
File.Delete(n);
當然,第一種方法比第二短。但如果ProcessOutput
調用寫入TempStream
的方法,則第二種方法將拋出異常。 (或設置其set訪問引發其事件處理程序分派到寫入TempStream
的方法,它是如何這個問題最終可能會發生呼叫事件的性質。)第一個將只產生無緣無故意想不到的效果。
你可以通過讓你的TempFileStream
類使用FileAccess.Write
打開底層FileStream
來解決這個問題。然後執行一個Rewind
方法關閉此FileStream
,並創建一個使用FileAccess.Read
一個新的。如果你這樣做,任何試圖寫入文件的方法在讀取訪問時打開(反之亦然),至少會拋出一個異常。
你必須使用的FileStream這一點,你不能使用的MemoryStream?這樣你就不必處理與刪除文件相關的所有可能的問題。 – armannvg 2009-10-05 12:01:15
@armannvg,你在說什麼問題?這是臨時存儲非常大的文件,然後將其記錄到數據庫中。 – sh0gged 2009-10-05 12:09:11
只是通常的文件刪除問題 - > IOException,UnauthorizedAccessException等,但如果你正在與一個非常大的文件,然後MemoryStream不是一個選項 – armannvg 2009-10-05 12:16:24