代码之家  ›  专栏  ›  技术社区  ›  A191919

deflatestream copyto memory流

  •  3
  • A191919  · 技术社区  · 7 年前

    轮胎压缩和减压 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
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Ray Brian Agnew    7 年前

    CopyTo 开始从 当前位置 源流的。

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

    确保位置 0 所以它可以找到任何要复制和压缩到流中的数据。

    正如@xanatos提到的,这同样适用于 Decompress ,因此请确保 compressedStream 在对其进行解压缩之前也将其定位为0。