Есть ли что-то вроде класса Filestorage для хранения файлов?

Есть ли что-то вроде класса, который можно использовать для хранения файлов и каталогов, точно так же, как можно использовать 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, что делает ее практически бесполезной в данном случае.

Бесполезно ли надеяться на такую ​​библиотеку классов?


person Community    schedule 30.05.2010    source источник


Ответы (4)


В базе данных SQLite вы можете хранить структуры, подобные каталогам... вам просто нужно иметь таблицу "Каталоги" с одной записью для каждого каталога, имеющую как минимум индекс и "родительское" поле (которое содержит индекс другого каталог или 0, если у него нет родителя). Затем у вас может быть таблица «Файлы», которая содержит атрибуты файлов, индекс родительского каталога и содержимое файла.

Вот и все, теперь у вас есть дерево каталогов в реляционной БД.

person Matteo Italia    schedule 30.05.2010

Кто-то указал мне на PhysicsFS, у которого есть API, похожий на то, что вы описываете, но это чистый C API, который делает все что тебе нужно. Можно легко написать тривиальную объектно-ориентированную оболочку.

person greyfade    schedule 03.10.2010
comment
похоже, с его помощью можно только читать архивы, но не создавать их... ну ладно. - person ; 03.10.2010
comment
@nebukadnezzar: Обсуждая это с парнем, который упомянул об этом, вероятно, его можно взломать, чтобы добавить эту функцию, это то, что я тоже хотел. Но это достаточно близко, чтобы хорошо рассмотреть. - person greyfade; 04.10.2010

Вы можете проверить http://www.cs.unc.edu/Research/compgeom/gzstream/

Если вы создаете свой собственный, Redis может быть лучшим выбором, чем SQLite, поскольку я считаю, что он лучше обрабатывает двоичные данные.

person shuttle87    schedule 30.05.2010
comment
Что не так с gz, tar или bz2, если вы все равно ищете какой-то другой формат контейнера? - person user7116; 30.05.2010
comment
@nebukadnezzar: отредактируйте свой вопрос, указав, что вы хотите хранить свои файлы именно в формате zip. С упоминанием о хранении вещей в SQLite казалось, что вы запрашиваете любой формат файла данных для хранения постоянных данных. - person shuttle87; 30.05.2010
comment
@sixlettervariables: ни bzip2, ни gzip не являются форматами контейнеров. почитайте о bzip2 и gzip и о том, как они реализованы. - person ; 30.05.2010
comment
@shuttle87: я никогда не упоминал, что хотел бы использовать исключительно zip-файлы. использование zip-файлов было просто примером. - person ; 30.05.2010
comment
Ваш пример с zip меня сбил с толку, тогда libtar - хороший выбор. Однако я сомневаюсь, что у вас будет для этого библиотека C++. HDF5 — еще один выбор, так как он легко хранит иерархические данные, просто он не будет иметь широкой поддержки. - person user7116; 31.05.2010
comment
@sixlettervariables: однажды я пытался написать оболочку C++ для libtar, но libtar супернизкоуровневый. абстрагирование его, безусловно, не является тривиальной задачей. Я не понимаю, почему в C++ еще нет java.util.zip.ZipFile. Qazip хорош, но полностью зависит от Qt (что не подходит для приложений, которые вообще не используют Qt). zziplib странно реализован и, похоже, находится под лицензией GPL (или LGPL - оба варианта сейчас не подходят). На самом деле создание архивов на C++ — это просто большая проблема. - person ; 31.05.2010

Я нашел время, чтобы написать крошечную, но работающую обертку вокруг libarchive. Я не совсем знаком со всеми возможностями Libarchive, но результат соответствует тому, что мне нужно:

archive_wrapper.cpp @ gist.github.com

Он использует libmars для строк и т. д. Но я думаю, было бы несложно заменить вхождения mars::mstring на std::string. И, конечно же, эта оболочка доступна под лицензией MIT/X11 (так же, как и libmars), что означает, что вы можете делать с ней все, что захотите. ;-)

person Community    schedule 13.10.2010
comment
Я знаю, что это зло и все такое, но поскольку это единственное решение, которое действительно соответствует тому, что мне нужно... Я принял свой собственный ответ. Я все еще очень благодарен за все опубликованные ответы! - person ; 13.10.2010