2013-08-20 2 views
6

Не знаю, как его спросить, поэтому я объясню ситуацию.Каковы способы сжатия каталога в один файл

Мне нужно сохранить несколько сжатых файлов. Первоначальная идея состояла в том, чтобы создать папку и сохранить как можно больше сжатых файлов, а также создать файл, содержащий данные о каждом сжатом файле.

Однако мне не разрешалось создавать много файлов и иметь только один. Я решил создать сжатый файл с заголовком о дальнейших данных и после того, как заголовок сохранит сжатые данные. Но этот вариант имеет недостатки, например. редактирование такого файла после его создания занимает много времени, потому что оно должно быть полностью переписано, даже если я хочу добавить еще один маленький файл.

Итак, как мне кажется, мне нужно создать папку с определенными атрибутами и создать столько файлов внутри. Возможно ли это?

Я создаю приложение для Windows, поэтому я могу использовать любой материал, который работает в Windows, и я кодирую C++.

ПРИМЕЧАНИЕ: Один файл необходим, потому что, например, он будет отправлен по электронной почте и прикреплен много файлов, не является идеальным решением.

ПРИМЕЧАНИЕ: Мне не нужен алгоритм сжатия, мне нужен способ эффективно хранить все в одном файле.

+1

Возможно, вы можете использовать [Структурированное хранилище] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa380369%28v=vs.85%29.aspx) для этого (но вы можете 't использовать с ними обычные функции файлов). – Medinoc

+0

Поскольку это Windows, вы можете использовать [Alternate Data Streams] (http://www.irongeek.com/i.php?page=security/altds) – MSalters

+0

Из любопытства, почему вам нужно создавать больше файлов, разрешено ли, и где в первую очередь возникает ограничение на один файл?Прежде чем создавать сложное решение (которое будет сложнее поддерживать в конечном итоге), вы проверили ** (a) **, что вы не можете проектировать свою программу по-другому или ** (b) **, что вы не можете говорить ваш клиент позволит вам создать обычный каталог (это, вероятно, будет в лучшем случае, в конце концов)? – stakx

ответ

1

Вы можете создать базу данных SQLite или базу данных SQL Server Compact Edition (которая находится в одном файле .sdf) и сохранить все ваши данные там как BLOB. Система управления базами данных должна быть достаточно простой для развертывания вместе с другими исполняемыми файлами вашего приложения.

В случае SQL Server Compact я не совсем уверен, насколько это простое использование из неуправляемого кода (C++). Это было бы довольно легко в .NET, но я уверен, что это может быть сделано для C++, но & mdash потребует некоторых исследований.

По крайней мере, this Stack Overflow question рассказывает о том, как подключиться к такой базе данных с C++ через поставщика OLE DB.

+0

Нет проблем с использованием 'SQLite' с' C++', но не уверен, что если бы boss_ хотел добавить в проект больше материала , потому что он босс, и иногда он принимает хорошие решения, иногда не так хорошо, если вы знаете, что я имею в виду :) – ST3

+0

@ user2623967: Да, я знаю. ;-) Иногда это помогает свести вашу проблему с точки зрения затрат по проекту: переосмысление колеса избавляет вас от зависимости от сторонней библиотеки, но обычно это дороже (требуется больше времени разработки). И может стоить дороже во время обслуживания, потому что у вашего собственного решения могут быть ошибки. SQLite, OTOH, является более зрелым продуктом и, как можно ожидать, будет хорошо работать. – stakx

+0

Ваш ответ, вероятно, лучше всего, но 'SQLite' не дает коэффициент сжатия, а сжатие и время распаковки не так важно, поэтому я остался с одним файлом. – ST3

0

В качестве другой альтернативы, вы можете использовать деготь файл: запись файла для пользовательского заголовка с информацией для других записей (сжатие и т.д.), а также все файлы, как записи в файле деготь. Я не знаю точно, как это работает, чтобы заменить запись библиотечными функциями (здесь я получил информацию о том, что это возможно, по крайней мере, с помощью утилиты командной строки gnu tar http://www.karkomaonline.com/index.php/2005/03/basic-tar-usage-gnu-tar/ на linux), но кажется, что это возможно без воссоздания всего архива. Думаю, вам нужно будет сначала создать большие фиктивные записи, чтобы иметь достаточно свободного места, доступного позже, чтобы эти записи были заменены всеми необходимыми данными.