GZipStream能够正常工作,但扩展名丢失。

11

我使用下面的代码压缩文件,它可以正常工作,但是当我使用 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();
    }
}

1
据我所知,GZip对文件或文件夹一无所知... 另一方面,ZIP与此非常不同,因为它内置了所有这些内容,包括文件属性等... 也许您想使用Zip库? - Yahia
换句话说,GZip 是一种压缩格式,而 ZIP 是一种压缩归档格式。(TAR 就是一个归档格式的例子。) - Marc L.
2个回答

29

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

这是Unix / Linux使用的方式已经有很长时间了...


1
谢谢,这就是问题所在,现在只需添加扩展名而不是用.zip替换它即可解决。 - Davide Piras

2

不起作用,因为zip对象没有Name或FileName属性可分配。尝试使用.NET 3.5和.NET 4,但没有任何区别... :( - Davide Piras
@Davide Piras 如果你使用DotNetZip,它有一个名为AddFile的方法,可以将文件名存储起来... GZip和ZIP是两种不同的东西,尽管它们的名称非常相似... - Yahia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接