¿Puedes evitar que StreamReader elimine la transmisión subyacente?

Hay alguna forma de hacer esto:

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... } 

Sin tener que abrir el archivo dos veces?

Parece que no puedo hacer que StreamReader no elimine mi transmisión. No quiero simplemente dejarlo fuera del scope, tampoco. Entonces, el recolector de basura eventualmente llamará al Dispose, matando a la stream.

No quiero simplemente dejarlo fuera del scope, tampoco. Entonces, el recolector de basura eventualmente llamará al Dispose, matando a la stream.

Garbage collector llamará al método Finalize (destructor), no al método Dispose . El finalizador llamará a Dispose(false) que no eliminará la transmisión subyacente. Debería estar bien dejando el StreamReader fuera del scope si necesita usar la transmisión subyacente directamente. Solo asegúrese de desechar la transmisión subyacente manualmente cuando sea apropiado.

.NET 4.5 finalmente solucionará este problema con los nuevos constructores en StreamReader y StreamWriter que toman un parámetro leaveOpen:

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

Puede usar la clase NonClosingStreamWrapper de la biblioteca MiscUtil de Jon Skeet, sirve exactamente para ese fin

Puede crear una clase nueva que herede de StreamReader y anular el método Cerrar; dentro de su método Close, llame a Dispose (false), que como señaló Mehrdad, no cierra la transmisión. Lo mismo se aplica a StreamWriter, por supuesto.

Sin embargo, parece que una mejor solución sería simplemente aferrarse a las instancias de StreamReader y StreamWriter siempre que las necesite. Si ya planea mantener la transmisión abierta, también podría mantener abiertos StreamReader y StreamWriter. Si usa StreamWriter.Flush y Stream.Seek correctamente, debería poder hacer que esto funcione incluso al leer y escribir.

Simplemente elimina el uso de Block. No es necesario que deseche () el StreamReader si no desea Dispose () la transmisión, creo.

Use otra sobrecarga de constructor donde puede especificar un parámetro “leaveOpen” como “verdadero”

Ciérrelo usted mismo en una cláusula try / finally cuando haya terminado con él.

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

Siempre uso algo como esto: (también usa el argumento leaveOpen )

 public static class StreamreaderExtensions { public static StreamReader WrapInNonClosingStreamReader(this Stream file) => new StreamReader(file, Encoding.UTF8, true, 1024, true); } 

Uso:

 using (var reader = file.WrapInNonClosingStreamReader()) { .... }