GZipStream仅解压缩第一行

时间:2012-06-26 19:23:01

标签: c# compression gzipstream

我的GZipStream只会解压缩文件的第一行。通过7-zip提取内容按预期工作,并提供整个文件内容。它也在cygwin和linux上使用gunzip按预期提取,所以我希望这是O / S特定的(Windows 7)。

我不确定如何对此进行故障排除,所以任何提示都会对我有所帮助。它听起来与this非常相似,但使用SharpZLib会产生相同的结果。

这就是我正在做的事情:

var inputFile = String.Format(@"{0}\{1}", inputDir, fileName);
var outputFile = String.Format(@"{0}\{1}.gz", inputDir, fileName);
var dcmpFile = String.Format(@"{0}\{1}", outputDir, fileName);

    using (var input = File.OpenRead(inputFile)) 
    using (var fileOutput = File.Open(outputFile, FileMode.Append))
    using (GZipStream gzOutput = new GZipStream(fileOutput, CompressionMode.Compress, true))
    {
        input.CopyTo(gzOutput);
    }

// Now, decompress
using (FileStream of = new FileStream(outputFile, FileMode.Open, FileAccess.Read))
using (GZipStream ogz = new GZipStream(of, CompressionMode.Decompress, false))
using (FileStream wf = new FileStream(dcmpFile, FileMode.Append, FileAccess.Write))
{
    ogz.CopyTo(wf); 
}

1 个答案:

答案 0 :(得分:4)

您的输出文件仅包含一行(gzip) - 但它包含除了换行符之外的所有文本数据。

您反复调用ReadLine(),它会返回一行文字而不会换行并将该文本转换为字节。所以如果你有一个输入文件:

abc
def
ghi

您最终得到的输出文件是

的压缩版本
abcdefghi

如果您不想要这种行为,为什么甚至首先要通过StreamReader?只需将输入FileStream直接复制到GZipStream一个块,或者如果您使用的是.NET 4,则使用Stream.CopyTo

// Note how much simpler the code is using File.*
using (var input = File.OpenRead(inputFile))
using (var fileOutput = File.Open(outputFile, FileMode.Append))
using (GZipStream gzOutput = new GZipStream(os, CompressionMode.Compress, true)) 
{
    input.CopyTo(gzOutput);
}

另请注意,附加到压缩文件中并不是一个好主意,除非您在单个文件中对多个“块”进行某种特殊处理。