Copiare il contenuto di uno Stream con un extension method

di , in .NET Framework,

La classe astratta Stream rappresenta un numero finito o infinito di byte che si possono leggere o scrivere con un approccio forward, cioè ogni lettura o scrittura scatenza l'avanzamento del cursor. Ne esistono varie implementazioni, le più importanti sono MemoryStream, FileStream e NetworkStream, e a seconda della tipologia è possibile leggere e/o scrivere, spostarsi avanti e indietro, e conoscerne la lunghezza.
Un'esigenza molto comune consiste nel dover copiare da uno Stream e scrivere su un altro, in genere da un file all'altro, oppure sul buffer di risposta di una pagina ASP.NET, oppure da uno Stream in memoria.

Per farlo esistono varie tecniche, ma la più performante lavora leggendo a gruppi di byte (solitamente di 4096 o 8192) dalla sorgente per poi scriverli sul target. Qualora sia possibile tenere aperti entrambi i lati, questa metodologia impiega meno risorse rispetto al caricare tutti i byte della sorgente in un array per poi scriverlo sulla destinazione, mentre diventa d'obbligo qualora la dimensione non è conosciuta a priori.

Lo script di oggi propone un extension method per effettuare questa operazione facilmente:

public static class StreamExtensions
{
    public static void WriteToStream(this Stream source, Stream target, int bufferSize)
    {
        int i = 0;
        // Preparo il buffer della dimensione richiesta
        byte[] buffer = new byte[bufferSize];

        // Ciciclamente riempio il buffer fino all'esaurimento
        while ((i = source.Read(buffer, 0, bufferSize)) > 0)
        {
            // Scrivo i byte letti sul target
            target.Write(buffer, 0, i);
        }
    }
}

Commenti

Visualizza/aggiungi commenti

Copiare il contenuto di uno Stream con un extension method (#93) 1010 2
| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi