Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > архивы gzip


Автор: Хал 8.5.2008, 08:02
Всем доброго дня!

Подскажите, пожалуйста, как из C++ Builder 2006 распаковать gzip-архив (файл .gz)!
Компоненты ZipForge? VCLUnZip и TZipBuilder его не берут.
С помощью ZipTV TUnGZip получилось, но он платный ))

Может есть какие-то бесплатные компоненты?
Да, забыл сказать, работаю в WinXP

Автор: xvr 8.5.2008, 10:13
Цитата(Хал @ 8.5.2008,  08:02)
Всем доброго дня!

Подскажите, пожалуйста, как из C++ Builder 2006 распаковать gzip-архив (файл .gz)!
Компоненты ZipForge? VCLUnZip и TZipBuilder его не берут.
С помощью ZipTV TUnGZip получилось, но он платный ))

Может есть какие-то бесплатные компоненты?
Да, забыл сказать, работаю в WinXP

Бери библиотеку zlib (www.zlib.org), она поддерживает (IMHO все перечисленные компоненты используют именно ее)

Автор: Хал 12.5.2008, 12:29
Подключил zlib и юзаю gzread. Получился такой вариант:

const int KILOB = 1024;
  char cb[KILOB];
  AnsiString arch = "C:\\111.xml.gz";
  FILE* outfile = fopen("C:\\newfile.xml", "wb");
   gzFile gfile = gzopen (arch.c_str(), "rb");
  int len = 0;
  do
  {
    len =  gzread (gfile, cb, KILOB);
    if(len < KILOB)  cb[len]=0;    
    fprintf(outfile, "%s" , cb);
  } while(len == KILOB);
  fclose(outfile);
  gzclose(gfile);

Напомню, задача просто вытащить файл из .gz архива. Может можно проще, не слишком коряво?  smile Знатоки zlib, подскажите!

Автор: ksili 12.5.2008, 12:43
А почему блоками распаковываете? Сразу целиком не получилось?

Автор: Хал 12.5.2008, 13:23
Добавлено @ 13:28
Не понял вопроса...
это как - целиком? в данном случае?

Автор: xvr 12.5.2008, 13:38
Цитата(Хал @ 12.5.2008,  12:29)
Подключил zlib и юзаю gzread. Получился такой вариант:

const int KILOB = 1024;
  char cb[KILOB];
  AnsiString arch = "C:\\111.xml.gz";
  FILE* outfile = fopen("C:\\newfile.xml", "wb");
   gzFile gfile = gzopen (arch.c_str(), "rb");
  int len = 0;
  do
  {
    len =  gzread (gfile, cb, KILOB);
    if(len < KILOB)  cb[len]=0;    
    fprintf(outfile, "%s" , cb);
  } while(len == KILOB);
  fclose(outfile);
  gzclose(gfile);

Напомню, задача просто вытащить файл из .gz архива. Может можно проще, не слишком коряво?  smile Знатоки zlib, подскажите!

Почти нормально, рекомендую заменить
Цитата

    if(len < KILOB)  cb[len]=0;    
    fprintf(outfile, "%s" , cb);

на
Код

   if (len>0) fwrite(cb,1,len,outfile);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)