Как сжать каталог с libbz2 в C++

Вы можете добавить конструктор без параметров в ваш класс и создать сеттер для всех ваших полей.

class ComplexService {
    private Service service1;
    private Service service2;
    private Service service3;
    private Service service4;
    private Service service5;

    public ComplexService(){
      super();
    }
    ...

    public void setService1(Service service1){
      this.service1 = service1;
    }
    //for other fields too
    ...
}

В своем тесте вы называете это как:

myService = new ComplexService()
myService.setService1(service1);
...
10
задан Fred Foo 4 November 2010 в 10:55
поделиться

2 ответа

Если предположить, что это не просто вопрос «как я могу это сделать», то очевидный способ - это запустить / выполнить exec GNU tar, чтобы сделать это за вас. Самый простой способ - с помощью библиотечной подпрограммы system (3) :

  system("/path/to/gtar cfj tarballname.tar.bz2 dirname");

Согласно this , в дистрибутиве libtar есть примеры программ.

Документация Bzip включает раздел о программирование с помощью libbz2 .

1
ответ дан 3 December 2019 в 22:01
поделиться

Okay, I worked up a quick example for you. No error checking and various arbitrary decisions, but it works. libbzip2 has fairly good web documentation. libtar, not so much, but there are manpages in the package, an example, and a documented header file. The below can be built with g++ C++TarBz2.cpp -ltar -lbz2 -o C++TarBz2.exe:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <libtar.h>
#include <bzlib.h>
#include <unistd.h>

int main()
{
    TAR *pTar;
    char tarFilename[] = "file.tar";
    char srcDir[] = "dirToZip/";
    char extractTo[] = ".";

    tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
    tar_append_tree(pTar, srcDir, extractTo);

    close(tar_fd(pTar));

    int tarFD = open(tarFilename, O_RDONLY);

    char tbz2Filename[] =  "file.tar.bz2";
    FILE *tbz2File = fopen(tbz2Filename, "wb");
    int bzError;
    const int BLOCK_MULTIPLIER = 7;
    BZFILE *pBz = BZ2_bzWriteOpen(&bzError, tbz2File, BLOCK_MULTIPLIER, 0, 0);

    const int BUF_SIZE = 10000;
    char* buf = new char[BUF_SIZE];
    ssize_t bytesRead;
    while((bytesRead = read(tarFD, buf, BUF_SIZE)) > 0) {
        BZ2_bzWrite(&bzError, pBz, buf, bytesRead);
    }        
    BZ2_bzWriteClose(&bzError, pBz, 0, NULL, NULL);
    close(tarFD);
    remove(tarFilename);

    delete[] buf;

}
15
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: