0

私は、libtarとlibbz2を使用してディレクトリを圧縮するstackoverflowのどこかで見つけた次のコードを持っています:

#include <libtar.h>
#include <bzlib.h>
#include <fcntl.h>
#include <string>
#include <iostream>

using namespace std;

int main(int argc, char **argv) {

    TAR *p_tar;
    char extract_to[] = ".";

    char *dst_path = argv[2];
    char *src_path = argv[1];

    tar_open(&p_tar,dst_path,NULL,O_WRONLY | O_CREAT,0644,TAR_GNU);
    tar_append_tree(p_tar,src_path,extract_to);

    close(tar_fd(p_tar));

    int tar_fd = open(dst_path,O_RDONLY);

    string bz2_file_name = dst_path;
    bz2_file_name.append(".bz2");

    FILE *bz2_file = fopen(bz2_file_name.data(),"wb");
    int bz2_err;
    const int BLOCK_MULTIPLIER = 7;

    BZFILE *pbz = BZ2_bzWriteOpen(&bz2_err,bz2_file,BLOCK_MULTIPLIER,0,0);

    const int BUF_SIZE = 10000;
    char* buffer = new char[BUF_SIZE];
    size_t bytes_read;

    while((bytes_read=read(tar_fd,buffer,BUF_SIZE))>0)
    {
        BZ2_bzWrite(&bz2_err,pbz,buffer,bytes_read);
    }
    BZ2_bzWriteClose(&bz2_err,pbz,0,NULL,NULL);

    close(tar_fd);
    remove(dst_path);

    return 0;
}

bz2ファイルを作成し、そのサイズは正しいように見えますが(5MBディレクトリから1.7 MB)、アーカイブ自体が破損していますが、arkでもコマンドラインtarでも開くことができません。何が問題ですか?

4

2 に答える 2

2

tarとbz2は、必要に応じてプロセスの異なるステップです。Tarは、多数のファイルをインデックス付きの1つのファイルに連結してから、bzip2でその単一のファイルを圧縮します。

手動で抽出するには、逆の順序で実行します。UNIX / Linuxシステムの場合:

bunzip2 file.tar.bz2

.tarファイルを提供する必要があります。

tar -xvf file.tar

tarファイル(tarballとも呼ばれます)から物事を抽出します。

于 2009-06-05T23:51:08.290 に答える
0

tar xjf thefile.tar.bz2targnu などの最新の実装で動作します。

于 2009-06-06T01:48:12.593 に答える