使用 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) { ... }
循环对存档进行单次传递,将其内容缓存在内存中;那么您将拥有您喜欢的不同目录和文件的任何数据结构。
我在 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) { ... }
循环对存档进行单次传递,将其内容缓存在内存中;那么您将拥有您喜欢的不同目录和文件的任何数据结构。