Почему моя программная компрессия сбрасывает расширение файла? - PullRequest
2 голосов
/ 19 июня 2010

Я использую 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-файле?

Ответы [ 2 ]

4 голосов
/ 19 июня 2010

Вам, вероятно, следует назвать ваши сжатые файлы filename.xml.gz - расширение gz намеренно удаляется, а расширение источника не сохраняется нигде в архиве, IIRC

1 голос
/ 10 августа 2018

У меня была такая же проблема, и другие ответы, похоже, неверны,

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);
    }
}
...