2008-11-25 15 views
5

? Me pregunto si existe una forma mejor/incorporada, que no sea el uso de un búfer de bytes y un bucle, para leer de una secuencia y escribirla en otro (en .NET). En general, esto se hace para aplicar una transformación a una secuencia y continuar.¿Cuál es la mejor manera de hacer que la salida de una secuencia entre

En este caso, lo que yo estoy cargando un archivo, poniéndolo a través de una secuencia de deshinchado y escribirlo en un archivo (Gestión de errores eliminado por simplicidad):

byte[] buffer = new byte[10000000]; 
using (FileStream fsin = new FileStream(filename, FileMode.Open)) 
{ 
    using (FileStream fsout = new FileStream(zipfilename, FileMode.CreateNew)) 
    { 
     using (DeflateStream ds = new DeflateStream(fsout, CompressionMode.Compress)) 
     { 
      int read = 0; 
      do 
      { 
       read = fsin.Read(buffer, 0, buffer.Length); 
       ds.Write(buffer, 0, read); 
      } 
      while (read > 0); 
     } 
    } 
} 
buffer = null; 

Editar:

.NET 4.0 ahora tiene una función Stream.CopyTo, Hallelujah

Respuesta

5

No hay mejor manera que eso, aunque tiendo a poner la parte de bucle en un método de extensión CopyTo, p.

public static void CopyTo(this Stream source, Stream destination) 
{ 
    var buffer = new byte[0x1000]; 
    int bytesInBuffer; 
    while ((bytesInBuffer = source.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     destination.Write(buffer, 0, bytesInBuffer); 
    } 
} 

que luego se podría llamar como:

fsin.CopyTo(ds); 
+0

Sí, lo haría esto si estábamos en 3.5. Generalmente lo colocamos en una biblioteca de métodos estáticos. –

+0

De hecho, solía llamarse StreamCopier.Copy antes de 3.5 :-) –

+1

Tenga en cuenta que está bien si está usando .NET 2.0, siempre y cuando esté usando C# 3. Puede seguir utilizando los métodos de extensión con un poco de engaño Consulte http://csharpindepth.com/Articles/Chapter1/Versions.aspx –

1

Ahora que lo pienso, no he visto ningún soporte integrado para conectar los resultados de una secuencia de entrada directamente en una secuencia de salida como usted 're de escribiendo This article on MSDN tiene un código para una clase "StreamPipeline" que hace el tipo de cosas que está describiendo.

3

.NET 4.0 ahora tiene una función Stream.CopyTo

+0

¡Excelente! Gracias –

Cuestiones relacionadas