Использование C # Zlib в приложении winform - PullRequest
2 голосов
/ 15 апреля 2011

Я хочу изменить, как моя программа распаковывает файл, использующий zlib. В настоящее время я использую offzip & .bat (пакетную программу) для распаковки файла при клике.

Вот что у меня есть в пакетной программе (love command promt XD)

@ECHO Off

cd %0\..\

start  %~dp0offzip.exe -a -1 *.bsg %~dp0 0

Но мне кажется, это просто безвкусно при использовании командного файла.

Так вот в чем вопрос. Как бы я поступил следующим образом.

  1. Открыть файл, распаковать его
  2. Повторное нажатие

Не знаю, помогает ли это или нет, но вот вариант, который я сейчас использую, чтобы распаковать и повторно сжать файл с помощью offzip сейчас.

Decompress:  offzip.exe -a -1 <file> <path> 0
-a decompresses whole file
-1 keeps decompressed file in one piece
0 starts at the offset 0x0

Recompress: packzip.exe -w -15 <input file> <output>
-w    winbits
-15   winbits equal -15

Если бы вы могли привести мне пример или кое-что, что также помогло бы. Я также ищу бесплатную простую в использовании библиотеку, которая поддерживает zlib. Я видел zlib.net, и, вероятно, пойду с этим, но просто попробую сделать домашнее задание на лучшую вещь.

Заранее благодарим за любую помощь в этом вопросе.

1 Ответ

4 голосов
/ 15 апреля 2011

Вам нужно DotNetZip .Цена правильная (трудно победить бесплатно).Производительность, по-видимому, хуже, чем у gzip / zip и их собратьев.

Использование простое.Вот как распаковать сжатый zlib файл:

using System.IO  ;
using Ionic.Zlib ;

namespace ZlibExample
{
    class Program
    {
        static void Main( string[] args )
        {
            using ( Stream     compressed = File.OpenRead( @"c:\foobar.zlib" ) )
            using ( ZlibStream zlib       = new ZlibStream( compressed , CompressionMode.Decompress ) )
            {
                byte[] buf  = new byte[short.MaxValue] ;
                int    bufl ;
                while ( 0 != (bufl=zlib.Read(buf,0,buf.Length) ) )
                {
                   DoSomethingWithDecompressedData( buf , bufl ) ;
                }
            }
            return ;
        }
    }

}

Сжатие так же просто:

using ( Stream     compressed = File.OpenWrite( @"c:\foobar.zlib" ) )
using ( ZlibStream zlib       = new ZlibStream( compressed , CompressionMode.Compress ) )
{
  byte[] buf ;
  while ( null != (buf=ReadSomeDataToCompress()) )
  {
    zlib.Write(buf,0,buf.Length) ;
  }
}

Или, если у вас есть известное количество данных, вы можете использоватьстатический метод

byte[] data = File.ReadAllBytes(@"c:\foobar.uncompressed.data") ;
ZlibStream.CompressBuffer(data) ;

Создание ZIP-файлов также не намного сложнее.Он также поддерживает сжатие в стиле gzip.


Отредактировано в примечание: DotNetZip используется для жизни в Codeplex.Кодекс был закрыт.Старый архив по-прежнему доступен в Codeplex .Похоже, что код был перенесен на Github:


...