GZipStream 进行 gzip 压缩但解压缩文件以 "Unexpected end of data" 结尾

GZipStream does gzipping but ungzipping file end up with "Unexpected end of data"

有人知道为什么我在解压缩 gzip 文件时收到 "Unexpected end of data" 错误消息吗?

为了验证字节数据没有损坏,我使用 FooTest4.csv 写入文件并且能够成功打开文件。

两个'FooTest3.csv.gzand 'FooTest2.csv.gz 运行在解压缩时变成"Unexpected end of data"。

    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;
    }

您可以同时进行压缩和写入,而不是加载字节、压缩和保存它们。另外我不知道你为什么使用 List<Byte> 而不是 byte[],也许就是这样。

void CompressFile(string inputPath, string outputPath)
{
   Stream readStream = new FileStream(inputPath, Filemode.Open);
   Stream writeStream = new FileStream(outputPath, FileMode.Create);
   Stream compressionStream = new GZipStream(writeStream. CompressionMode.Compress);
   byte[] data = new byte[readStream.Length];
   readStream.Read(data, 0, data.Length);
   compressionStream.Write(data, 0, data.Length);
   readStream.Close();
   writeStream.Close();    
}

byte[] CompressFile(string inputPath)
{
  byte[] data = File.ReadAllBytes(inputPath);
  MemoryStream memStream = new MemoryStream(data);
  var gzipStream = new GZipStream(memStream, CompressionMode.Compress);
  gzipStream.Write(data, 0, data.Length);
  gzipStream.Close();
  return gzipStream.ToArray();
}

PS: 我是用文本编辑器写的代码,所以可能会有错误。另外你说错误在"unzippiing",为什么不告诉我们解压码?

需要关闭 GZipStream,以便它可以将一些终止数据写入缓冲区的末尾以完成 gzip 编码。

byte[] inputBytes = ...;
using (var compressedStream = new MemoryStream())
{
    using (var compressor = new GZipStream(compressedStream, CompressionMode.Compress))
    {
        compressor.Write(inputBytes, 0, inputBytes.Length);
    }

    // get bytes after the gzip stream is closed 
    File.WriteAllBytes(pathToFile, compressedStream.ToArray());
}