【问题标题】:GZipStream only decompresses first lineGZipStream 只解压第一行
【发布时间】:2012-06-26 19:23:00
【问题描述】:

我的 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); 
}

【问题讨论】:

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

标签: c# compression gzipstream


【解决方案1】:

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

您反复调用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);
}

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

【讨论】:

  • 文件的全部内容似乎没有被压缩成一行。问题文件只有630个字符,文件内容与解压正确的文件的第一行一致。不过,我会尝试您建议的缩短的 sn-p。
  • @duckus:这与我所看到的不符。我刚刚使用测试文件尝试了您的代码,它的行为完全符合我的预期。我不认为你那里有一个 U+0000 字符,这让解压缩文件的查看器吓坏了?
  • 在我的源文件中,我使用 char.ConvertFromUtf32(1) 对列进行分隔——对于 Control-A,并使用 Environment.NewLine() 分隔每一行。不过,我可以尝试从直接流中压缩内容,而不是从文件中加载它们。只是看看是否会发生同样的事情。
  • @duckus:如果您可以在网络上的某个地方(仅包含虚拟数据)发布示例文件,那将会有所帮助。
  • 好的...我刚刚添加了一个示例:github.com/sf-billops/misc-projects/tree/master/Misc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多