Как сжать тарбол с помощью gzip? - PullRequest
0 голосов
/ 14 февраля 2011

Эй, мне было интересно, знает ли кто-нибудь, как я могу сжать файл tarball с помощью gzip. Я уже извлек этот и успешно сжал тарбол, хотя я хочу затем сжать этот тарбол с помощью gzip вместо libbz2.

Я также пытался реализовать функцию gztack из примера gzappend.c из исходного кода zlib. , но в итоге получил кучу ошибок и осудил предупреждения, поэтому я решил, что не буду получить много от устаревшего примера.

Кто-нибудь знает, как мне этого добиться, желательно с библиотекой zlib?

Ответы [ 4 ]

4 голосов
/ 14 февраля 2011

Используйте подпрограммы zlib gzopen, чтобы открыть сжатый поток, gcwrite, чтобы записать в него данные и сжать его, и gzclose, чтобы закрыть его.Вот полная программа, которая сжимает один файл в другой:

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <zlib.h>

int main(int argc, char **argv)
{
  if(argc < 3)
  {
    fprintf(stderr, "Usage: %s input output\n", argv[0]);
    return 1;
  }

  // Open input & output files
  FILE *input = fopen(argv[1], "rb");
  if(input == NULL)
  {
    fprintf(stderr, "fopen: %s: %s\n", argv[1], strerror(errno));
    return 1;
  }

  gzFile output = gzopen(argv[2], "wb");
  if(output == NULL)
  {
    fprintf(stderr, "gzopen: %s: %s\n", argv[2], strerror(errno));
    fclose(input);
    return 1;
  }

  // Read in data from the input file, and compress & write it to the
  // output file
  char buffer[8192];
  int N;
  while((N = fread(buffer, 1, sizeof(buffer), input)) > 0)
  {
    gzwrite(output, buffer, N);
  }

  fclose(input);
  gzclose(output);

  return 0;
}

Используйте это так:

$ ./mygzip input output.gz
$ diff input <(gunzip < output.gz)  # Verify that it worked
2 голосов
/ 14 февраля 2011

Вы пробовали просто использовать zlib?Здесь есть учебное пособие: http://www.zlib.net/zlib_how.html

Это, конечно, хороший способ создать файл gzip.В соответствии с вашими заявленными целями я бы предположил, что использование popen() или system() для запуска программы не так уж и велико (требует, чтобы на машине было установлено что-то еще, не говоря уже о том, что это менее эффективно, если вы собираетесь делать это много).

0 голосов
/ 14 февраля 2011

Построение строки аргумента const char * для команды tar и передача ее в функцию system () в cstdlib.h, вероятно, самый простой способ сделать это.Или используя popen (), как упоминалось в ответе Фу Баха.Мне трудно поверить, что ваши целевые платформы включают платформы без tar или gzip, поскольку даже оболочки восстановления, такие как BusyBox, имеют доступ к tar.После того, как system () / popen () вернется (очевидно, проверьте код возврата на успешность), создайте ifstream для сжатого файла и делайте с ним все, что вам нравится.

РЕДАКТИРОВАТЬ: Когда выотмечать что-то Linux, люди склонны считать, что это означает конкретно и только Linux.Конечно, tar не будет работать для стандартных установок операционных систем Windows, поэтому в этом случае, да, предоставьте пакетную zlib dll и используйте zlib, как упоминает Джон.

0 голосов
/ 14 февраля 2011

Существует ясный способ сделать это в оболочке:

gzip ball.tar

Вы можете использовать программу C ++ для запуска команды с помощью системного вызова popen.

Вы также можетенаписать оболочку для zlib, которая эмулирует c ++ iostream (например, http://www.cs.unc.edu/Research/compgeom/gzstream/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...