使用 libarchive 在 zip 中按 path/name 定位文件

Locating a file by path/name in a zip using libarchive

我在 c/c++ 中使用 libarchive 来创建文件的 zip 存档,我正在尝试寻找是否有一种好方法来查找文件名(或者更确切地说是文件在路径) 已经存在于文件中。

目前,我唯一的方法是循环遍历所有 headers 并将文件名与我希望放入 zip 的文件名进行比较,基于 libarchive 网站的示例代码:

  struct mydata *mydata;
  struct archive *a;
  struct archive_entry *entry;
  mydata = malloc(sizeof(struct mydata));
  a = archive_read_new();
  mydata->name = name;
  mydata->fd = open(mydata->name, O_RDONLY); // Include O_BINARY on Windows
  archive_read_support_compression_all(a);
  archive_read_support_format_all(a);
  archive_read_open(a, mydata, NULL, myread, myclose);
  while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
     printf("%s\n",archive_entry_pathname(entry));
  }
  archive_read_finish(a);
  free(mydata);

printf函数已经在我的代码中进行了编辑,以进行比较。显然,随着 zip 文件变大并且有大量 headers 需要检查。

这是最好的方法还是我遗漏了一些更简单的方法?

正如 libarchive 的 README 所暗示的,该库旨在处理流式存档,而不是随机访问的存档。因此,按理说,为了在存档中找到一个文件,你必须“滚动磁带”,可以这么说,直到你找到它。

您可以像@kiner_shah 建议的那样,通过使用 while (archive_read_next_header(my_archive, &entry) == ARCHIVE_OK) { ... } 循环对存档进行单次传递,将其内容缓存在内存中;那么您将拥有您喜欢的不同目录和文件的任何数据结构。