将MemoryStream复制到FileStream并保存文件?

Sta*_*tan 39 c# memorystream file-upload filestream

我不明白我在这里做错了什么.我生成了几个内存流,在调试模式下,我看到它们已经填充.但是当我尝试复制MemoryStreamFileStream为了保存文件时fileStream没有填充文件并且文件长度为0bytes(空).

这是我的代码

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Syn*_*der 59

您需要在复制之前重置流的位置.

outStream.Position = 0;
outStream.CopyTo(fileStream);
Run Code Online (Sandbox Code Playgroud)

您使用outStream时使用了保存文件imageFactory.那个功能填充了outStream.填充outStream位置时设置为填充区域的末尾.这样,当你继续向steam写入字节时,它不会覆盖现有的字节.但是为了阅读它(出于复制目的),你需要将位置设置为开始,这样你就可以在开始时阅读.

  • @BassamAlugili他使用imageFactory保存文件时使用了outteam.这个功能填补了整个过程.在填充流出时,位置设置为填充区域的末尾.这样,当你继续向steam写入字节时,它不会覆盖现有的字节.但是为了阅读它(出于复制目的),你需要将位置设置为开始,这样你就可以在开始时阅读. (7认同)

Jam*_*urt 16

如果您的目标只是将内存流转储到物理文件(例如查看内容) - 可以一次完成:

memoryStream.Position = 0;
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`memoryStream.Position = 0;`。[MemoryStream.ToArray() 明确忽略位置](https://docs.microsoft.com/en-us/dotnet/api/system.io.memorystream.toarray?view=netframework-4.7.2)。 (2认同)

Fab*_*ler 5

另一种替代方案CopyToWriteTo.

优势:

无需重置位置。

用法:

outStream.WriteTo(fileStream);                
Run Code Online (Sandbox Code Playgroud)

功能说明:

将此内存流的全部内容写入另一个流。