Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么程序压缩会删除文件扩展名?_C#_Compression_Gzip_Gzipstream_Gunzip - Fatal编程技术网

C# 为什么程序压缩会删除文件扩展名?

C# 为什么程序压缩会删除文件扩展名?,c#,compression,gzip,gzipstream,gunzip,C#,Compression,Gzip,Gzipstream,Gunzip,我正在使用C#以编程方式压缩xml文件。压缩工作正常,但是当我从命令行压缩文件时,扩展名被删除了。为什么会这样 传入的目标文件具有gz扩展名,而源文件具有xml扩展名 这是我的压缩代码: using (FileStream input = File.OpenRead(filename)) { using (var raw = File.Create(destFilename)) {

我正在使用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);
                        }
                    }
                }
            }
当我使用第三方库(SharpLibZip)压缩文件时也会发生这种情况


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

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

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

Gzip有一种将原始文件名存储在归档文件中的方法,它在1996年起的:

如果设置了FNAME,则会显示原始文件名,
以零字节结尾。名称必须由ISO组成
8859-1(拉丁-1)个字符;[……]

不幸的是,标准的.Net System.IO.Compression库似乎无法设置FNAME。
但是您可以使用,它具有几乎相同的界面,其中
GZipStream
具有附加字段
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);
    }
}

destFilename
的值是多少?我已经尝试了filename.xml.gz和filename.gz。查看代码时,这一点也很明显。它们只是压缩字节流,而不是文件(包括元数据)本身。因此,最终归档文件不可能有文件名。这是GZip的标准约定。它的工作原理与Zip不同,Zip包含文件元数据。