C# 为什么程序压缩会删除文件扩展名?
我正在使用C#以编程方式压缩xml文件。压缩工作正常,但是当我从命令行压缩文件时,扩展名被删除了。为什么会这样 传入的目标文件具有gz扩展名,而源文件具有xml扩展名 这是我的压缩代码: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)) {
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包含文件元数据。