【问题标题】:DeflateStream CopyTo MemoryStreamDeflateStream 复制到 MemoryStream
【发布时间】:2018-07-01 10:27:57
【问题描述】:

想压缩和解压缩MemoryStream 但似乎CopyTo 不像预期的那样工作?为什么?如何解决这个问题?

public static MemoryStream Compress(MemoryStream originalStream)
{
    Console.WriteLine("Original before compressing size: {0}", originalStream.Length.ToString());
    MemoryStream compressedMemoryStream = new MemoryStream();

    using (DeflateStream deflateStream = new DeflateStream(compressedMemoryStream, CompressionMode.Compress, true))
    {
        originalStream.CopyTo(deflateStream);
    }
    Console.WriteLine("Compressed size: {0}", compressedMemoryStream.Length.ToString());
    return compressedMemoryStream;
}

public static void Decompress(MemoryStream compressedStream)
{
    Console.WriteLine("Compressed before decompressing size: {0}", compressedStream.Length.ToString());
    using (MemoryStream decompressedFileStream = new MemoryStream())
    {
         using (DeflateStream decompressionStream = new DeflateStream(compressedStream, CompressionMode.Decompress, true))
         {
              decompressionStream.CopyTo(decompressedFileStream);
         }
         Console.WriteLine("Decompressed size: {0}", decompressedFileStream.Length.ToString());
    }
}

输出:

Original before compressing size: 5184054
Compressed size: 0
Compressed before decompressing size: 0
Decompressed size: 0

【问题讨论】:

  • 在开始复制之前,请确保您的 originalStream 位于 Position = 0。否则它将找不到任何要复制的内容,位于流的末尾(因为您之前向其写入了数据?)。
  • @RayKoopa,是的,你是对的!发布答案我会接受它!
  • @A191919 记得把新的MemoryStream compressedMemoryStream 移到最后的Position = 0

标签: c# memorystream deflate


【解决方案1】:

CopyTo 开始从源流的当前位置复制字节。

由于您发布的压缩流大小为 0,我很确定 originalStream 位于流的末尾,因此没有字节被复制/压缩。

确保位置为0,以便它可以找到任何数据以复制并压缩到您的流中。

正如@xanatos 提到的,同样适用于Decompress,因此在解压缩之前确保compressedStream 也位于0。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2013-09-16
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多