667 votes

Comment enregistrer un flux dans un fichier?

J'ai un objet StreamReader que j'ai initialisé avec un flux, maintenant je veux enregistrer ce flux sur le disque (le flux peut être un .gif ou .jpg ou .pdf ).

Code existant:

 StreamReader sr = new StreamReader(myOtherObject.InputStream);
 
  1. Je dois enregistrer ceci sur le disque (j'ai le nom de fichier).
  2. Dans le futur, je pourrais vouloir stocker ceci à SQL Server.

J'ai aussi le type d'encodage, dont j'ai besoin si je le stocke sur SQL Server, correct?

864voto

Antoine Leclair Points 5818

Comme le souligne Tilendor dans la réponse de Jon Skeet, les flux ont une méthode CopyTo depuis .NET 4.

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

Ou avec la syntaxe using :

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

503voto

Jon Skeet Points 692016

Vous ne devez pas utiliser StreamReader pour les fichiers binaires (comme le format gif ou jpg). StreamReader est pour le texte de données. Vous aurez presque certainement perdre des données si vous l'utilisez pour des données binaires arbitraires. (Si vous utilisez l'Encodage.GetEncoding(28591) vous serez probablement d'accord, mais quel est le point?)

Pourquoi avez-vous besoin d'utiliser un StreamReader ? Pourquoi ne pas tout simplement garder les données binaires comme des données binaires et de l'écrire sur le disque (ou SQL) en tant que données binaires?

EDIT: Comme cela semble être quelque chose que les gens veulent voir... si vous ne voulez juste pour copier un flux à un autre (par exemple, pour un fichier) utiliser quelque chose comme ceci:

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

L'utiliser pour faire un dump d'un flux vers un fichier, par exemple:

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

70voto

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

22voto

jhonjairoroa87 Points 29
private void SaveFileStream(String path, Stream stream)
{
    var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
    stream.CopyTo(fileStream);
    fileStream.Dispose();
}

5voto

Adrian Points 155

Pourquoi ne pas utiliser un objet 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);
     }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: