我有一个tar文件,我想用libarchive提取到一个特定的目录。我怎样才能把libarchive提取到任何我想要的目录中?目前,它总是提取到我的程序的工作目录。我查看了这个答案,但是它所做的只是更改了存档中的归档条目的位置,也就是说,它仍然提取到我的程序的工作目录中,就在另一个子目录中。
发布于 2011-12-06 09:22:08
来自libarchive的讨论板:
“当然,这取决于正在提取的档案。
通常,您需要将chdir()放到您希望输出的目录中,然后使用类似于Wiki示例页面中的代码:
或者在untar.c示例程序中:
当然,如果您正在提取的tar文件有有趣的文件名(例如“c:\某个其他目录”),那么您需要在解压缩时使用文件名。
请注意,这些示例都使用archive_read_next_header()从描述下一个条目的输入存档中获取一个条目对象;然后您可以自由地以您希望的任何方式编辑该条目描述--特别是您可以更改名称、所有者或权限--然后调用archive_write_header()在磁盘上重新创建该条目。
以上Wiki中的示例页面可能是最好的起点。“
发布于 2014-09-23 09:41:38
我下一步解决了这个问题:(在调用'archive_write_header‘函数之前插入这段代码)
const char* currentFile = archive_entry_pathname(archiveEntry);
const std::string fullOutputPath = destination + currentFile;
archive_entry_set_pathname(archiveEntry, fullOutputPath.c_str());其中destination是输出路径。而且它是有效的。
发布于 2021-11-19 11:05:48
一个更长的C版本的亚历克斯的答案。要将文件解压缩到temp_dir,请使用archive_entry_pathname()和archive_entry_set_pathname()重写每个条目::
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);
}https://stackoverflow.com/questions/8384266
复制相似问题