2008-11-25 10 views
5

Zastanawiam się, czy istnieje lepszy/wbudowany sposób, inny niż przy użyciu bufora bajtów i pętli, do odczytu z jednego strumienia i napisać go do inny (w .NET). Zwykle robi się to, aby zastosować transformację do strumienia i przenieść ją.Jaki jest najlepszy sposób, aby dane wyjściowe jednego strumienia wejściowego do innego

W tym przypadku, co mam ładowania pliku, umieszczając ją poprzez strumienia siadać i pisać go do pliku (Obsługa błędów usunięte dla uproszczenia):

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; 

Edit:

.NET 4.0 ma teraz funkcję Stream.CopyTo, Alleluja

Odpowiedz

5

Nie ma lepszego sposobu na to, chociaż staram się umieścić część z zapętleniem w metodzie rozszerzającej CopyTo, np.

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); 
    } 
} 

które można następnie wywołać jak:

fsin.CopyTo(ds); 
+0

Tak, chciałbym to zrobić jeśli byliśmy na 3,5. Zwykle umieszczamy go w statycznej bibliotece metod. –

+0

Rzeczywiście, nazywał się StreamCopier.Copy przed 3.5 :-) –

+1

Zauważ, że to dobrze, jeśli używasz .NET 2.0, o ile używasz C# 3. Wciąż możesz używać metod rozszerzeń z odrobiną oszustwa. Zobacz http://csharpindepth.com/Articles/Chapter1/Versions.aspx –

1

Teraz, kiedy o tym myślę, nie widziałem żadnej wbudowanej obsługi przesyłania wyników strumienia wejściowego bezpośrednio do strumienia wyjściowego "re de skrobanie. This article on MSDN ma kod dla klasy "StreamPipeline", która robi coś, co opisujesz.

Powiązane problemy