我的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);
}
答案 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);
}
另请注意,将附加到压缩文件中并不是一个好主意,除非您在单个文件中对多个“块”进行某种特殊处理。