14

2つのMemoryStreamインスタンスがあります。

それらを1つのインスタンスにマージする方法は?

さて、今はあるMemoryStreamから別のMemoryStreamにコピーすることはできません。方法は次のとおりです。

public static Stream ZipFiles(IEnumerable<FileToZip> filesToZip) {
ZipStorer storer = null;
        MemoryStream result = null;
        try {
            MemoryStream memory = new MemoryStream(1024);
            storer = ZipStorer.Create(memory, GetDateTimeInRuFormat());
            foreach (var currentFilePath in filesToZip) {
                string fileName = Path.GetFileName(currentFilePath.FullPath);
                storer.AddFile(ZipStorer.Compression.Deflate, currentFilePath.FullPath, fileName,
                               GetDateTimeInRuFormat());
            }
            result = new MemoryStream((int) storer.ZipFileStream.Length);
            storer.ZipFileStream.CopyTo(result); //Does not work! 
                                               //result's length will be zero
        }
        catch (Exception) {
        }
        finally {
            if (storer != null)
                storer.Close();
        }
        return result;
    }
4

3 に答える 3

50

CopyToまたはCopyToAsyncで非常に簡単です:

var streamOne = new MemoryStream();
FillThisStreamUp(streamOne);
var streamTwo = new MemoryStream();
DoSomethingToThisStreamLol(streamTwo);
streamTwo.CopyTo(streamOne); // streamOne holds the contents of both

フレームワーク、人々。フレームワーク。

于 2013-03-27T11:11:48.930 に答える
5

上記の@Willによって共有された回答に基づいて、ここに完全なコードがあります:

void Main()
{
    var s1 = GetStreamFromString("Hello");
    var s2 = GetStreamFromString(" World");

    var s3 = s1.Append(s2);
    Console.WriteLine(Encoding.UTF8.GetString((s3 as MemoryStream).ToArray()));
}

public static Stream GetStreamFromString(string text)
{
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(text);
        writer.Flush();
        stream.Position = 0;

        return stream;
}

public static class Extensions
{ 
    public static Stream Append(this Stream destination, Stream source)
    {
        destination.Position = destination.Length;
        source.CopyTo(destination);

        return destination;
    }
}

asyncそして、ストリームコレクションを:とマージします。

async Task Main()
{
    var list = new List<Task<Stream>> { GetStreamFromStringAsync("Hello"), GetStreamFromStringAsync(" World") };

    Stream stream = await list
            .Select(async item => await item)
            .Aggregate((current, next) => Task.FromResult(current.Result.Append(next.Result)));

    Console.WriteLine(Encoding.UTF8.GetString((stream as MemoryStream).ToArray()));
}

public static Task<Stream> GetStreamFromStringAsync(string text)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(text);
    writer.Flush();
    stream.Position = 0;

    return Task.FromResult(stream as Stream);
}

public static class Extensions
{
    public static Stream Append(this Stream destination, Stream source)
    {
        destination.Position = destination.Length;
        source.CopyTo(destination);

        return destination;
    }
}
于 2017-06-12T21:04:14.217 に答える
1
  • 1番目と2番目の長さの合計に等しい長さで3番目(としましょうmergedStream)を作成しますMemoryStream

  • MemoryStream最初に書き込みます(から取得するためにmergedStream使用します)GetBuffer()byte[]MemoryStream

  • MemoryStream2番目に書くmergedStream(使用GetBuffer()

  • 書き込み中のオフセットについて覚えておいてください。

むしろ追加ですが、MemoryStreamsでのマージ操作が何であるかは完全に不明です。

于 2013-03-27T09:54:19.150 に答える