1

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

目前,我唯一的方法是循环浏览所有标题并将文件名与我希望放入 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 文件变大并且要检查大量标头,这会产生相当大的开销。

这是最好的方法还是我错过了更简单的东西?

4

1 回答 1

1

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

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

于 2021-11-02T12:02:08.440 回答