1

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

我不确定如何解决这个问题,所以任何关于这方面的提示都会对我有很大帮助。听起来与此非常相似,但使用 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); 
}
4

1 回答 1

4

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

您反复调用ReadLine()which 返回一行没有换行符的文本并将该文本转换为字节。因此,如果您有一个输入文件,其中包含:

abc
def
ghi

你最终会得到一个输出文件,它是

abcdefghi

如果您不想要这种行为,为什么还要StreamReader首先经历 a 呢?一次只需从输入FileStream直接复制到GZipStreama 块,或者Stream.CopyTo如果您使用的是 .NET 4,则使用:

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

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

于 2012-06-26T19:30:59.053 回答