如何在档案中阅读文件?

时间:2015-07-19 10:47:36

标签: c++

如何阅读存档中的文件名? (例如:.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;
}

1 个答案:

答案 0 :(得分:4)

编写另一个可以从头开始读取存档文件的库是不切实际的。为什么重新发明轮子?我会尽力为您提供尽可能多的信息,让您做您想做的事。

使用libarchive

有一个很棒的小库,名为libarchive,用C语言编写。它能够读取几乎所有你能想到的档案文件,只是在这里列举一些他们在网站上所说的内容:

  

读取各种格式,包括tar,pax,cpio,zip,xar,lha,   ar,cab,mtree,rar和ISO映像。

安装libarchive

在开始使用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

  1. c++ archivereader.cpp -l archive -o archivereader

  2. archivereader Ubuntu.iso

  3. 注释

    虽然我已经证明了这个库还有更多。

    更多例子

    这个git页面上有一个很好的信息:https://github.com/libarchive/libarchive/wiki/Examples

    官方libarchive网站

    官方网站包含有用的文档链接和源代码。

    http://www.libarchive.org/