你可以让StreamReader处理底层的stream吗?

有没有办法做到这一点:

this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); using(var sr = new StreamReader(this.logFile)) { // Read the data in } // ... later on in the class ... this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); using(var sw = new StreamWriter(this.logFile)) { // Write additional data out... } 

而不必打开文件两次?

我似乎无法使StreamReader不处理我的stream。 我也不想让它超出范围。 然后垃圾收集器将最终调用Dispose,杀死stream。

我也不想让它超出范围。 然后垃圾收集器将最终调用Dispose,杀死stream。

垃圾收集器将调用Finalize方法(析构函数),而不是Dispose方法。 终结器将调用Dispose(false) ,这将不会处理基础stream。 如果您需要直接使用底层的stream,您应该可以保持StreamReader超出范围。 只要确保在适当的时候手动处理底层stream。

.NET 4.5将最终解决这个问题与一个新的构造函数StreamReader和StreamWriter需要一个leaveOpen参数:

 StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen) StreamWriter(Stream stream, System.Text.Encoding encoding, int bufferSize, bool leaveOpen) 

你可以使用Jon Skeet的MiscUtil库中的NonClosingStreamWrapper类,它完全适合这个目的

您可以创build一个从StreamReaderinheritance的新类并重写Close方法; 在你的Close方法中,调用Dispose(false),就像Mehrdad指出的那样,不closuresstream。 当然,这同样适用于StreamWriter。

然而,似乎更好的解决scheme只要保持在StreamReader和StreamWriter实例,只要你可能需要它们。 如果您已经打算保持stream打开,那么也可以保持StreamReader和StreamWriter处于打开状态。 如果正确使用StreamWriter.Flush和Stream.Seek,则即使在读取和写入时也应该能够正常工作。

只要删除使用块。 如果您不想Dispose()stream,我不需要Dispose()StreamReader。

使用另一个构造函数重载,您可以在其中指定“leaveOpen”参数为“true”

当你完成它时,在try / finally子句中自己closures它。

 var sr = new StreamReader(); try { //...code that uses sr //....etc } finally { sr.Close(); }