C# GZipStream没有压缩吗?

C# GZipStream没有压缩吗?,c#,compression,C#,Compression,我正在尝试将一个内存流压缩到另一个内存流中,以便可以上载到RESTAPI图像是包含tif图像的初始内存流 WebRequest request = CreateWebRequest(...); request.ContentType = "application/zip"; MemoryStream zip = new MemoryStream(); GZipStream zipper = new GZipStream(zip, CompressionMode.Compress); image.

我正在尝试将一个内存流压缩到另一个内存流中,以便可以上载到RESTAPI<代码>图像是包含tif图像的初始内存流

WebRequest request = CreateWebRequest(...);
request.ContentType = "application/zip";
MemoryStream zip = new MemoryStream();
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress);
image.CopyTo(zipper);
zipper.Flush();
request.ContentLength = zip.Length; // zip.Length is returning 0
Stream reqStream = request.GetRequestStream();
zip.CopyTo(reqStream);
request.GetResponse().Close();
zip.Close();
据我所知,我写入GZipStream的任何内容都将被压缩并写入传递到其构造函数中的任何流。当我将图像流复制到zipper中时,似乎没有实际复制任何内容(图像为200+MB)。这是我第一次体验GZipStream,所以我可能错过了一些东西,任何关于什么的建议都将非常感谢

编辑: 我应该注意的是,在上面的代码中,
image
的位置在流的最末端,这对我来说是个问题。。。因此,当我调用
image.CopyTo(zippers)时由于位置原因,未复制任何内容。

请参见此示例:


您不应该在流上调用flush。

[编辑:删除GZipStream及其构造函数参数的错误信息,并使用真实答案更新:)]

复制到zipper后,需要将MemoryStream的位置移回零,因为zipper写入内存流的过程会推进其“光标”以及正在读取的流:

WebRequest request = CreateWebRequest(...);
request.ContentType = "application/zip";
MemoryStream zip = new MemoryStream();
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress);
image.CopyTo(zipper);
zipper.Flush();
zip.Position = 0; // reset the zip position as this will have advanced when written to.
...

另一件需要注意的事情是GZipStream是不可查找的,因此调用.Length会引发异常。

我对C及其库一无所知,但我会尝试使用
Close
而不是(或之后)
Flush


(Java的GZipOutputStream也有同样的问题,直到Java 7才正确刷新。)

请注意:如果TIFF已经压缩(我认为大多数是压缩的),您将不会得到令人印象深刻的结果。这些是未压缩的GeoTIFF。另外,我上传这些图片的RESTAPI要求上传是一个zip。除了using语句之外,我看不出示例所做的和我正在做的有什么区别。我确实计划在工作时添加using语句,直到那时我才希望它们破坏什么范围内的内容。调用
Flush()
有什么错?解释GZipStream似乎不可访问,似乎完全合法+1,但是MSDN示例在创建GZip流(而不是底层流)之后向GZip流添加数据。OP没有误解Zipper。CopyTo(reqStream)抛出异常。拉链无法从中读取。在多次阅读Kip的链接MSDN文章之后,我越看你的示例。。。我越觉得你误解了GZipStream。看来Close()确实是个问题!zippers.Close()对我来说不见了,我确信原版也不见了。看看这个答案: