2010-11-03 89 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