【问题标题】:GZipStream works but extension is lostGZipStream 工作,但扩展丢失
【发布时间】:2011-10-14 10:57:18
【问题描述】:

我正在使用以下代码压缩文件,它工作正常,但是当我使用 WinRar 解压缩时,我得到没有扩展名的原始文件名,任何线索为什么如果文件名是 myReport.xls,当我解压缩时我只得到 myReport ?

using (var fs = new FileStream(fileName, FileMode.Open))
{
    byte[] input = new byte[fs.Length];
    fs.Read(input, 0, input.Length);
    fs.Close();

    using (var fsOutput = new FileStream(zipName, FileMode.Create, FileAccess.Write))
    using(var zip = new GZipStream(fsOutput, CompressionMode.Compress))
    {
        zip.Write(input, 0, input.Length);
        zip.Close();
        fsOutput.Close();
    }
}

【问题讨论】:

  • AFAIK GZip 不知道文件或文件夹... OTOH ZIP 与此非常不同,因为它具有所有这些,包括文件属性等。内置...也许您想使用 Zip图书馆?
  • IOW,GZip 是一种压缩格式,而 ZIP 是一种压缩存档格式。 (TAR 将是存档格式的一个示例。)

标签: c# .net compression gzipstream


【解决方案1】:

GZip 只压缩一个文件 - 不知道名称。因此,如果您压缩文件myReport.xls,您应该将其命名为myReport.xls.gz。解压时,最后一个文件扩展名将被删除,因此您最终会得到原始文件名。

这就是它多年来在 Unix/Linux 中的使用方式......

【讨论】:

  • 谢谢,这就是问题所在,现在只需附加扩展名而不是用 .zip 替换它即可解决。
【解决方案2】:

确实很奇怪。简短的搜索得出以下结论:

http://dotnetzip.codeplex.com/discussions/268293

这说明 GZipStream 无法知道正在写入的流的名称,并建议您直接设置 FileName 属性。

希望对您有所帮助。

【讨论】:

  • 不,它不起作用,因为 zip 对象没有要分配的 Name 或 FileName 属性。尝试使用 .NET 3.5 和 .NET 4 但没有区别... :(
  • @Davide Piras 但是,如果您使用 DotNetZip,它有一个方法 AddFile - 它获取文件名并存储它... GZip 与 ZIP 不同,尽管名称非常相似...
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
相关资源
最近更新 更多