【问题标题】:Is there something like a Filestorage class to store files in?是否有类似 Filestorage 类的东西来存储文件?
【发布时间】:2011-02-25 17:10:48
【问题描述】:

是否有类似于类的东西可以用来存储文件和目录,就像使用 Zip 文件的方式一样?

由于我还没有找到任何“真实”类来编写 Zip 文件(真实类如 real 类), 如果能够将文件和目录存储在类似容器的文件中,那就太好了。

一个完美的 API 可能如下所示:

int main()
{
    ContainerFile cntf("myContainer.cnt", ContainerFile::CREATE);
    cntf.addFile("data/some-interesting-stuff.txt");
    cntf.addDirectory("data/foo/");
    cntf.addDirectory("data/bar/", ContainerFile::RECURSIVE);
    cntf.close();
}

...我希望你能得到这个想法。 重要要求是:

  • 库必须是跨平台的
  • 在这种情况下,任何 *GPL 都是不可接受的(MIT 和 BSD 许可证是)

我已经考虑过创建一个基于 SQLite 的实现(以及它存储二进制 blob 的能力)。不幸的是,在 SQLite 数据库中存储目录结构似乎是不可能的,这使得它在这种情况下几乎毫无用处。

希望这样的类库是不是没用?

【问题讨论】:

    标签: c++ filesystems archive containers


    【解决方案1】:

    我花时间围绕 libarchive 编写了一个小而有效的包装器。我并不完全熟悉 Libarchive 的所有功能,但结果符合我的需要:

    archive_wrapper.cpp @ gist.github.com

    它将 libmars 用于字符串等。但我想用std::string 替换出现的mars::mstring 不会太难。 当然,这个包装器在 MIT/X11 许可下可用(就像 libmars 一样),这意味着你可以用它做任何你想做的事情。 ;-)

    【讨论】:

    • 我知道这是邪恶的,但因为它是唯一真正适合我需要的解决方案。我接受了我自己的答案。我仍然非常感谢所有发布的答案!
    【解决方案2】:

    有人向我指出PhysicsFS,它的 API 与您描述的类似,但它是一个纯 C API,可以满足您的所有需求。可以轻松编写一个简单的面向对象的包装器。

    【讨论】:

    • 看起来你只能用它读取档案,但不能创建它们......嗯。
    • @nebukadnezzar:与提到它的人讨论它,它可能会被黑客入侵以添加该功能,这也是我想要的。但它足够近,可以很好看。
    【解决方案3】:

    在 SQLite 数据库中,您可以存储类似目录的结构...您只需要有一个“目录”表,每个目录都有一个条目,至少有一个索引和一个“父”字段(其中包含另一个目录的索引,如果没有父目录,则为 0)。然后就可以有一个“Files”表,里面包含文件属性、父目录索引和文件内容。

    就是这样,现在您在关系数据库中拥有了目录树。

    【讨论】:

      【解决方案4】:

      您可能想查看http://www.cs.unc.edu/Research/compgeom/gzstream/

      如果您自己制作,那么 redis 可能是比 SQLite 更好的选择,因为我相信它可以更好地处理二进制数据。

      【讨论】:

      • 如果您正在寻找其他容器格式,那么 gz 或 tar 或 bz2 有什么问题?
      • @nebukadnezzar:编辑您的问题,说明您希望专门以 zip 格式存储文件。提到在 SQLite 中存储内容,您似乎要求使用任何数据文件格式来存储持久数据。
      • @sixlettervariables:bzip2 和 gzip 都不是容器格式。阅读 bzip2 和 gzip,以及它们是如何实现的。
      • @shuttle87:我从来没有提到我想专门使用 zipfiles。使用 zipfiles 只是一个例子。
      • 你的 zip 示例让我失望,libtar 是一个不错的选择。但是,我怀疑你会有一个 C++ 库。 HDF5 是另一种选择,因为它很容易存储分层数据,只是不会得到广泛的支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2016-10-17
      • 2016-08-02
      • 2013-07-30
      相关资源
      最近更新 更多