如何阅读存档中的文件名? (例如:.img) 我已经尝试了下面的代码,但它仍然输出第一个文件的名称。
bool ReadFile(char* file, std::string& name)
{
Header header;
std::fstream file;
file.open(file, std::fstream::in | std::fstream::binary);
if (file.is_open())
{
file.read(reinterpret_cast<char*>(&header), sizeof(Header));
file.seekg(sizeof(Header) + 4, file.cur);
std::string vertemp(header.name, 22);
name = vertemp;
return true;
}
return false;
}
答案 0 :(得分:4)
编写另一个可以从头开始读取存档文件的库是不切实际的。为什么重新发明轮子?我会尽力为您提供尽可能多的信息,让您做您想做的事。
有一个很棒的小库,名为libarchive,用C语言编写。它能够读取几乎所有你能想到的档案文件,只是在这里列举一些他们在网站上所说的内容:
读取各种格式,包括tar,pax,cpio,zip,xar,lha, ar,cab,mtree,rar和ISO映像。
在开始使用libarchive之前,您需要在计算机上安装它。如果您使用的是debian基本操作系统,那么您很幸运,否则您可能需要在给定发行版的软件包存储库中搜索该库。或者,您可以按照网站上的文档进行操作,该文档将向您展示如何从源代码install库。打开终端并输入以下命令:
sudo apt-get install libarchive-dev
这个小例子将打印内容的名称,包括档案中文件的完整路径。
#include <iostream>
#include <archive.h>
#include <archive_entry.h>
using namespace std;
int main(int argc, char** argv)
{
struct archive *a;
struct archive_entry *entry;
int r;
a = archive_read_new();
archive_read_support_filter_all(a);
archive_read_support_format_all(a);
r = archive_read_open_filename(a, argv[1], 10240); // Note 1
if (r != ARCHIVE_OK)
return 1;
while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
cout << archive_entry_pathname(entry) << endl;
archive_read_data_skip(a);
}
r = archive_read_free(a);
if (r != ARCHIVE_OK)
return 1;
}`
我已将上面的代码保存在archivereader.cpp
中 c++ archivereader.cpp -l archive -o archivereader
archivereader Ubuntu.iso
虽然我已经证明了这个库还有更多。
这个git页面上有一个很好的信息:https://github.com/libarchive/libarchive/wiki/Examples
官方网站包含有用的文档链接和源代码。