2012-06-26 117 views
1

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

我不确定如何去解决这个问题,所以任何提示都会帮助我很多。这听起来与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

如果这是相关的,我还应该补充一点,当我构建文件时,我使用Environment.NewLine()来分隔每一行。 – duckus

回答

4

你的输出文件只包含一个一行(gzip压缩) - 但它包含除换行符以外的文本数据的所有

您一再呼叫ReadLine(),它将返回一行文字而没有换行符并将该文本转换为字节。所以,如果你有其中有一个输入文件:

abc 
def 
ghi 

你想最终比增

abcdefghi 

的压缩版本的输出文件。如果你不希望这样的行为,为什么还要首先通过StreamReader?从输入FileStream只需复制直奔GZipStream块的时间,或使用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); 
} 

还要注意的是追加到压缩文件很少是个好主意,除非你在单个文件中对多个“块”进行某种特殊处理。

+0

似乎并未将文件的全部内容压缩为一行。问题文件只有630个字符,并且文件内容与正确解压缩文件的第一行相同。尽管如此,我会尝试缩短您的建议片段。 – duckus

+0

@duckus:这不符合我所看到的。我只是用一个测试文件来测试你的代码,它的行为完全如我所料。我不认为你在那里有一个U + 0000字符,这使得查看器对解压缩文件感到惊讶。 –

+0

在我的源文件中,我使用char.ConvertFromUtf32(1)为Control-A分隔列,并使用Environment.NewLine()分隔每行。我可能会尝试,从直接流中压缩内容而不是从文件中加载它们。只是为了看看是否发生了同样的事情。 – duckus