GZipStream执行gzipping但是解压缩文件最终会出现"意外的数据结束"

时间:2016-08-11 17:27:59

标签: c# gzipstream

有谁知道为什么我会收到"意外的数据结束"解压缩gzip文件时出现错误信息?

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

两个' FooTest3.csv.gz and 'FooTest2.csv.gz遇到了#34;意外的数据结束"当解压缩时。

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

2 个答案:

答案 0 :(得分:1)

需要关闭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());
}

答案 1 :(得分:0)

您可以立即进行压缩和写入,而不是加载字节,压缩和保存它们。此外,我不知道你为什么使用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”,为什么没有向我们展示解压缩代码?