web-dev-qa-db-fra.com

Copier MemoryStream dans FileStream et enregistrer le fichier?

Je ne comprends pas ce que je fais mal ici. Je génère quelques flux de mémoire et en mode débogage, je constate qu'ils sont remplis. Mais lorsque j'essaie de copier MemoryStream vers FileStream afin de sauvegarder le fichier fileStream n'est pas renseigné et que le fichier a une longueur de 0 octet (vide).

Voici mon code

if (file.ContentLength > 0)
{
    var bytes = ImageUploader.FilestreamToBytes(file); // bytes is populated

    using (var inStream = new MemoryStream(bytes)) // inStream is populated
    {
        using (var outStream = new MemoryStream())
        {
            using (var imageFactory = new ImageFactory())
            {
                imageFactory.Load(inStream)
                            .Resize(new Size(320, 0))
                            .Format(ImageFormat.Jpeg)
                            .Quality(70)
                            .Save(outStream);
            }

            // outStream is populated here

            var fileName = "test.jpg";

            using (var fileStream = new FileStream(Server.MapPath("~/content/u/") + fileName, FileMode.CreateNew, FileAccess.ReadWrite))
            {
                outStream.CopyTo(fileStream); // fileStream is not populated
            }
        }
    }
}
37
sed

Vous devez réinitialiser la position du flux avant de copier.

outStream.Position = 0;
outStream.CopyTo(fileStream);

Vous avez utilisé outStream lors de l'enregistrement du fichier à l'aide de imageFactory. Cette fonction a rempli le outStream. Lors du remplissage du outStream, la position est définie à la fin de la zone peuplée. Ainsi, lorsque vous continuez à écrire des octets sur Steam, cela ne remplace pas les octets existants. Mais ensuite, pour le lire (à des fins de copie), vous devez définir la position au début de sorte que vous puissiez commencer à lire au début.

57
SynerCoder

Si votre objectif est simplement de vider le flux de mémoire dans un fichier physique (par exemple, pour regarder le contenu), vous pouvez le faire en un seul geste:

memoryStream.Position = 0;
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());
16
James Harcourt

Une autre alternative à CopyTo est WriteTo.

Avantage:

Pas besoin de réinitialiser la position.

Utilisation:

outStream.WriteTo(fileStream);                

Description de la fonction:

Écrit l'intégralité du contenu de ce flux de mémoire dans un autre flux.

3
Fabian Bigler