首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libarchive -提取到指定目录

libarchive -提取到指定目录
EN

Stack Overflow用户
提问于 2011-12-05 10:59:48
回答 3查看 9.4K关注 0票数 14

我有一个tar文件,我想用libarchive提取到一个特定的目录。我怎样才能把libarchive提取到任何我想要的目录中?目前,它总是提取到我的程序的工作目录。我查看了这个答案,但是它所做的只是更改了存档中的归档条目的位置,也就是说,它仍然提取到我的程序的工作目录中,就在另一个子目录中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-06 09:22:08

来自libarchive的讨论板:

“当然,这取决于正在提取的档案。

通常,您需要将chdir()放到您希望输出的目录中,然后使用类似于Wiki示例页面中的代码:

一个完整的抽取实例

或者在untar.c示例程序中:

untar示例

当然,如果您正在提取的tar文件有有趣的文件名(例如“c:\某个其他目录”),那么您需要在解压缩时使用文件名。

请注意,这些示例都使用archive_read_next_header()从描述下一个条目的输入存档中获取一个条目对象;然后您可以自由地以您希望的任何方式编辑该条目描述--特别是您可以更改名称、所有者或权限--然后调用archive_write_header()在磁盘上重新创建该条目。

以上Wiki中的示例页面可能是最好的起点。“

票数 8
EN

Stack Overflow用户

发布于 2014-09-23 09:41:38

我下一步解决了这个问题:(在调用'archive_write_header‘函数之前插入这段代码)

代码语言:javascript
复制
    const char* currentFile = archive_entry_pathname(archiveEntry);
    const std::string fullOutputPath = destination + currentFile;
    archive_entry_set_pathname(archiveEntry, fullOutputPath.c_str());

其中destination是输出路径。而且它是有效的。

票数 28
EN

Stack Overflow用户

发布于 2021-11-19 11:05:48

一个更长的C版本的亚历克斯的答案。要将文件解压缩到temp_dir,请使用archive_entry_pathname()archive_entry_set_pathname()重写每个条目::

代码语言:javascript
复制
char* dest_file;

for (;;) {
    r = archive_read_next_header(a, &entry);
    if (r == ARCHIVE_EOF)
      break;
    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(a));
    if (r < ARCHIVE_WARN)
      return NULL;

    asprintf(&dest_file, "%s/%s", temp_dir, archive_entry_pathname(entry));
    archive_entry_set_pathname(entry, dest_file);
    // printf(" writing %s\n", dest_file);

    r = archive_write_header(ext, entry);
    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(ext));
    else if (archive_entry_size(entry) > 0) {
      r = copy_data(a, ext);
      if (r < ARCHIVE_OK)
        fprintf(stderr, "%s\n", archive_error_string(ext));
      if (r < ARCHIVE_WARN)
        exit(1);
    }
    r = archive_write_finish_entry(ext);
    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(ext));
    if (r < ARCHIVE_WARN)
      return NULL;

    free(dest_file);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8384266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档