【发布时间】:2023-03-08 20:16:01
【问题描述】:
有谁知道为什么我在解压缩 gzip 文件时收到“意外的数据结束”错误消息?
为了验证字节数据没有损坏,我使用FooTest4.csv 写入文件并能够成功打开文件。
'FooTest3.csv.gzand 'FooTest2.csv.gz 在解压缩时都遇到了“意外的数据结尾”。
public static List<byte> CompressFile(List<byte> parmRawBytes)
{
//Initialize variables...
List<byte> returnModifiedBytes = null;
File.WriteAllBytes(@"X:\FooTest4.csv", parmRawBytes.ToArray());
using (var memoryStream = new MemoryStream())
{
using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, false))
{
gzipStream.Write(parmRawBytes.ToArray(), 0, parmRawBytes.ToArray().Length);
gzipStream.Flush();
File.WriteAllBytes(@"X:\FooTest3.csv.gz", memoryStream.ToArray());
returnModifiedBytes = memoryStream.ToArray().ToList();
}
}
File.WriteAllBytes(@"X:\FooTest2.csv.gz", returnModifiedBytes.ToArray());
return returnModifiedBytes;
}
【问题讨论】:
-
您过早地调用
memoryStream.ToArray():GZipStream.Dispose将内容写入其底层流。删除对gzipStream.Flush的调用(没有实际意义),然后从内部using块下拉出对memoryStream.ToArray()的调用。 -
拨打
memoryStream.ToArray(),这是什么意思? -
将它放在外部
using块内,但在内部:using (var memoryStream = ...) { using (var gzipStream = ...) { gzipStream.Write(...); } memoryStream.ToArray(); }之外。 -
就是这样!现在可以了。我很惊讶它必须在外面才能工作,这意味着必须先关闭 gzipstream。
-
没什么好惊讶的。 GZip 压缩方法不是附加的,它必须准确知道所有传入数据何时结束才能发出压缩数据。这就是为什么
Flush对GZipStream没有影响。您调用Flush并不意味着您以后不会插入更多数据 - 要添加的每个新字节都可能会更改整个压缩数据块。
标签: c# gzipstream