【问题标题】:Using libtar to compress a directory使用 libtar 压缩目录
【发布时间】:2009-06-05 23:44:40
【问题描述】:

我在 stackoverflow 的某个地方找到了这段代码,它使用 libtar 和 libbz2 来压缩目录:

#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 打开它。有什么问题?

【问题讨论】:

    标签: c++ linux compression tar


    【解决方案1】:

    tar 和 bz2 如果您愿意,它们是该过程的不同步骤。 Tar 将一堆文件连接到一个带有索引的文件中,然后 bzip2 压缩该单个文件。

    要手动提取,请按相反的顺序进行。在 unix/linux 系统上:

    bunzip2 文件.tar.bz2

    应该给你一个.tar文件,然后你可以

    tar -xvf 文件.tar

    从 tar 文件(也称为 tarball)中提取内容。

    【讨论】:

    • 他并没有尝试在命令行中执行此操作,而是尝试以编程方式执行此操作。
    • 他的问题在于他如何尝试打开档案来检查它,而不是他创建档案。
    【解决方案2】:

    tar xjf thefile.tar.bz2 与现代 tar 实现配合使用,例如 gnu。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多