У меня была такая же проблема, и другие ответы, похоже, неверны,
Gzip имеет способ сохранить оригинальное имя файла в архиве, это указано в RFC-1952 от 1996:
Если задано FNAME, присутствует оригинальное имя файла,
завершается нулевым байтом.Имя должно состоять из символов ISO
8859-1 (LATIN-1);[...]
К сожалению, стандартная библиотека .Net System.IO.Compression, похоже, не имеет возможности установить FNAME.
Но вы можете использовать DotNetZip , который имеет почти такой же интерфейс и где 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);
}
}