2010-11-03 63 views
1

我有一個文件流:
如何關閉與特定文件相關的所有FileStreams?

tempOutputStream = new FileStream(sTempFileName, FileMode.OpenOrCreate, 
    FileAccess.ReadWrite, FileShare.ReadWrite); 

一旦文件被創建,你可以創建額外的文件流讀/寫tempOutputStream。 有沒有一種方法可以關閉所有沒有ref的流對象?或者至少是第一個創建流的人。

的問題是,我想刪除該文件,但流的一個未關閉,所以我在File.Delete有一個例外......

謝謝。

問候, 列昂尼德

回答

1

沒有,沒有。

您需要修復您的代碼,並確保在完成使用時關閉所有流。
使用using聲明。

+0

無法使用「使用」 - 我在一個地方創建流,然後許多類在其方法中使用它...許多舊代碼:( – Leonid 2010-11-03 19:52:58

1

一個可能的解決方案:

  • 延長FileStream類,或創建流推導它
  • ,添加方法類似GetNewStream()
  • 該方法可以返回新的數據流,並寫入它的參考一些內部List<Stream>
  • 倍率Close(),和Close()每個從列表
  • 倍率0流和Dispose()從列表

這樣,你會在代碼的主線隱藏的功能,它應該是,離你而去的每個流。

另外,爲防止硬重構:

  • 我的猜測是,你有這樣的事情Stream s=originalStream.GetStream();在你的代碼(我不通過心臟知道流是如何複製...)
  • 創建一個單,將包含Map<Stream, list<Stream>>和幾種方法:
    • RegisterStreamChild(Stream Parent, Stream Child);
    • CloseAllChildSteams(Stream Parent)
  • 實施那些使用包含在單例中的地圖<>的方法
  • 搜索您的代碼以查找流複製的發生。使用第一種方法註冊新流
  • 搜索您的代碼以查看流關閉的發生。使用第二種方法關閉所有子流
+0

我想到類似的解決方案,但這使我做了大量的重構...不管怎樣,謝謝! – Leonid 2010-11-03 19:56:08

+0

@Leonid:重構,如果做得好,從長遠來看,這會給你帶來很多好處。我會在答案中提出替代解決方案... – 2010-11-03 19:57:29

相關問題