Qual è il modo migliore per rendere l'output di uno stream l'input per un altro

StackOverflow https://stackoverflow.com/questions/316007

  •  11-07-2019
  •  | 
  •  

Domanda

Mi chiedo se esiste un modo migliore / integrato, oltre all'utilizzo di un buffer di byte e looping, per leggere da uno stream e scriverlo su un altro (in .NET). Generalmente questo viene fatto per applicare una trasformazione a uno stream e spostarla su.

In questo caso, cosa sto caricando un file, inserendolo in un flusso di deflazione e scrivendolo in un file (gestione degli errori rimossa per semplicità):

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;

Modifica

.NET 4.0 ora ha una funzione Stream.CopyTo, Alleluia

È stato utile?

Soluzione

Non c'è davvero un modo migliore di quello, anche se tendo a mettere la parte del ciclo in un metodo di estensione CopyTo , ad esempio

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

Che poi potresti chiamare come:

fsin.CopyTo(ds);

Altri suggerimenti

.NET 4.0 ora ha un Funzione Stream.CopyTo

Ora che ci penso, non ho mai visto alcun supporto integrato per il piping dei risultati di un flusso di input direttamente in un flusso di output come stai descrivendo. Questo articolo su MSDN ha del codice per un " StreamPipeline " classe che fa il genere di cose che stai descrivendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top