614 votos

¿Cómo puedo guardar una corriente a un archivo?

Tengo un StreamReader objeto que inicializa con un arroyo, ahora quiero guardar esta corriente en el disco (la corriente puede ser un .gif o .jpg o .pdf ).

Código existente:

 StreamReader sr = new StreamReader(myOtherObject.InputStream);
 
  1. Tengo que salvar a este disco (no tengo el nombre del archivo).
  2. En el futuro es posible que quiera guardar este a SQL Server.

Tengo el tipo de codificación también, que voy a necesitar si lo guarde para SQL Server, ¿correcto?

794voto

Antoine Leclair Puntos 5818

Como ha destacado Tilendor en la respuesta de Jon Skeet, arroyos tienen un CopyTo método desde Framework 4.

 var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();
 

O con el using sintaxis:

 using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
    myOtherObject.InputStream.CopyTo(fileStream);
}
 

482voto

Jon Skeet Puntos 692016

Usted no debe usar StreamReader para los archivos binarios (como gif o jpg). StreamReader es para el texto de los datos. Casi ciertamente perder datos si se utiliza para datos binarios arbitrarios. (Si utiliza Encoding.GetEncoding(28591) probablemente estará de acuerdo, pero ¿cuál es el punto?)

¿Por qué usted necesita usar un StreamReader ? ¿Por qué no sólo mantener los datos binarios como datos binarios y escribir en el disco (o SQL) como datos binarios?

EDIT: Ya que este parece ser algo que la gente quiere ver... si hacer sólo desea copiar una secuencia a otra (p. ej. a un archivo) usar algo como esto:

/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8 * 1024];
    int len;
    while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, len);
    }    
}

A utilizar para el volcado de un arroyo a un archivo, por ejemplo:

using (Stream file = File.Create(filename))
{
    CopyStream(input, file);
}

61voto

Darren Corbett Puntos 149
public void CopyStream(Stream stream, string destPath)
{
  using (var fileStream = new FileStream(destPath, FileMode.Create, FileAccess.Write))
  {
    stream.CopyTo(fileStream);
  }
}

8voto

George Puntos 95
//If you don't have .Net 4.0  :)

public void SaveStreamToFile(Stream stream, string filename)
{  
   using(Stream destination = File.Create(filename))
      Write(stream, destination);
}

//Typically I implement this Write method as a Stream extension method. 
//The framework handles buffering.

public void Write(Stream from, Stream to)
{
   for(int a = from.ReadByte(); a != -1; a = from.ReadByte())
      to.WriteByte( (byte) a );
}

/*
Note, StreamReader is an IEnumerable<Char> while Stream is an IEnumbable<byte>.
The distinction is significant such as in multiple byte character encodings 
like Unicode used in .Net where Char is one or more bytes (byte[n]). Also, the
resulting translation from IEnumerable<byte> to IEnumerable<Char> can loose bytes
or insert them (for example, "\n" vs. "\r\n") depending on the StreamReader instance
CurrentEncoding.
*/

5voto

Adrian Puntos 155

¿Por qué no utilizar un objeto FileStream?

 public void SaveStreamToFile(string fileFullPath, Stream stream)
{
    if (stream.Length == 0) return;

    // Create a FileStream object to write a stream to a file
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
    {
        // Fill the bytes[] array with the stream data
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int)bytesInStream.Length);

        // Use FileStream object to write to the specified file
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
     }
}
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X