2010-05-30 2 views
4

Есть ли что-то вроде класса, который может использоваться для хранения файлов и каталогов, так же, как можно использовать файлы Zip?Есть ли что-то вроде класса Filestorage для хранения файлов?

Поскольку я не нашел какой-либо «реальный» класс для записи Zip файлов (реальный класс, как в реального класса), Было бы неплохо, чтобы иметь возможность хранить файлы и директорию в контейнере типа файла.

Совершенный 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 License являются)

Я уже играл с мыслью о создании Имплантирование на основе SQLite (и его способность хранить двоичные капли). К сожалению, представляется невозможным хранить структуры каталогов в базе данных SQLite, что делает его в этом случае бесполезным.

Неужели не стоит надеяться на такую ​​библиотеку классов?

ответ

-1

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

archive_wrapper.cpp @ gist.github.com

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

+0

Я знаю, что это зло и все, но поскольку это единственное решение, которое действительно соответствует тому, что мне нужно ... Я принял свой собственный ответ. Я все еще очень благодарен за все опубликованные ответы! – 2010-10-13 07:45:03

+0

@ user350814 Пожалуйста, обновите ссылку. – neo

0

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

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

+0

gzip не zip – 2010-05-30 15:03:30

+1

Что не так с gz или tar или bz2, если вы ищете какой-либо другой формат контейнера в любом случае? – user7116

+2

@nebukadnezzar: отредактируйте свой вопрос, чтобы указать, что вы хотите хранить ваши файлы в формате ZIP. С упоминанием хранения вещей в SQLite казалось, что вы запрашиваете какой-либо формат файла данных для хранения постоянных данных. – shuttle87

2

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

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

1

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

+0

PhysicsFS выглядит полезным :) –

+0

приятный, он выглядит очень перспективным! Спасибо за ссылку! – 2010-10-03 17:26:51

+0

похоже, что вы можете читать только архивы, но не создавать их ... ах. – 2010-10-03 18:32:45