2

我正在使用 C# 以编程方式压缩 xml 文件。压缩工作正常,但是当我从命令行对文件进行压缩时,扩展名已被删除。为什么会这样?

传入的目标文件具有 gz 扩展名,而源文件具有 xml 扩展名。

这是我的压缩代码:

            using (FileStream input = File.OpenRead(filename))
            {
                using (var raw = File.Create(destFilename))
                {
                    using (Stream gzipStream = new GZipStream(raw, CompressionMode.Compress))
                    {
                        byte[] buffer = new byte[4096];
                        int n;
                        while ((n = input.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            gzipStream.Write(buffer, 0, n);
                        }
                    }
                }
            }

当我使用 3rd 方库 (SharpLibZip) 压缩文件时也会发生这种情况。

如何将扩展名保留在压缩的 zip 文件中?

4

2 回答 2

4

您可能应该将压缩文件命名为 filename.xml.gz - gz 扩展名被有意删除,并且源扩展名未存储在档案中的任何位置,IIRC

于 2010-06-19T16:26:23.670 回答
1

我有同样的问题,其他答案似乎是错误的,

Gzip 有一种方法可以将原始文件名存储在存档中,它在1996 年的RFC-1952中指定:

如果设置了 FNAME,则存在原始文件名,
以零字节结尾。名称必须由 ISO
8859-1 (LATIN-1) 字符组成;[...]

不幸的是,标准的 .Net System.IO.Compression 库似乎没有设置 FNAME 的能力。
但是你可以使用DotNetZip,它的界面几乎相同,并且在哪里GZipStream有额外的字段FileName
一定要在第一次调用之前设置 FileName Write(),否则会失败

public void GzipFileNoOverwrite(string src, string dst)
{
    var bytes = File.ReadAllBytes(src);
    using (FileStream fs =new FileStream(dst, FileMode.CreateNew))
    using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Compress, CompressionLevel.Level8, false))
    {
        zipStream.FileName = Path.GetFileName(src) ?? throw new ArgumentException($"Can't get filename from '{src}'");
        zipStream.Write(bytes, 0, bytes.Length);
    }
}
于 2018-08-10T06:54:18.960 回答