c# - DeflateStream 复制到 MemoryStream
问题描述
想压缩和解压缩,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
解决方案
CopyTo
开始从源流的当前位置复制字节。
由于您发布了生成的压缩流大小为 0,我很确定它originalStream
位于流的末尾,因此没有字节被复制/压缩。
确保该位置0
可以找到要复制和压缩到您的流中的任何数据。
正如@xanatos 提到的,这同样适用于Decompress
,因此在解压缩之前确保它compressedStream
也位于 0 处。
推荐阅读
- http - 如何在 Protractor 中处理 zone-evergreen.js HTTP 400 错误请求?
- ios - 仅拖动和缩放“选定”视图
- ruby-on-rails - Rails 6 - Shrine - ImageProcessing - 获取原始上传文件
- eslint - Cornerstone 6.0.0 eslint 更新
- excel - 不包括具有重复条件的行的值总和
- java - 当我只想使用模拟器时,是否需要 Firebase 服务帐户?
- python - Python 和 Bokeh 上的聚类;选择允许用户更改聚类算法的小部件
- json - React - 使用 JSON 的动态路由
- oracle - 如何使用选择语句插入具有 2 个表组合的第一行虚拟破折号值
- python - 在 wsl2 ubuntu2004 上安装 pycld2 失败