web-dev-qa-db-ja.com

MemoryStreamをFileStreamにコピーしてファイルを保存しますか?

ここで私が間違っていることを理解していません。いくつかのメモリストリームを生成しますが、デバッグモードではそれらが読み込まれていることがわかります。しかし、ファイルを保存するためにMemoryStreamFileStreamにコピーしようとすると、fileStreamは読み込まれず、ファイルの長さは0バイト(空)になります。

ここに私のコードがあります

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

コピーする前に、ストリームの位置をリセットする必要があります。

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

outStreamを使用してファイルを保存するときに、imageFactoryを使用しました。その関数はoutStreamを生成しました。 outStreamにデータを入力している間、位置はデータが入力された領域の最後に設定されます。これは、Steamにバイトを書き続けても、既存のバイトを上書きしないようにするためです。ただし、(コピーの目的で)読み取るには、位置を開始位置に設定して、開始時に読み取りを開始できるようにする必要があります。

57
SynerCoder

目的が単にメモリストリームを物理ファイルにダンプすることである場合(例えば、内容を見るため)-それは一度に実行できます:

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

CopyToの別の代替手段はWriteToです。

利点:

位置をリセットする必要はありません。

使用法:

outStream.WriteTo(fileStream);                

関数の説明:

このメモリストリームの内容全体を別のストリームに書き込みます。

3
Fabian Bigler