Здравствуйте, dimb82, Вы писали:
D>Теперь требуется, чтобы файл образа на лету упаковывался в архив какого-нибудь популярного формата (zip, tar, bz2, ...). D>Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?
нет конечно. им ведь потом сжатые данные надо в результирующий архив записать, верно? а куда их записывать, если они ещё предыдущие данные не видели и не знают насколько те сожмутся?
для этого потребуется специально разработанный формат архива, с индексом
Люди, я люблю вас! Будьте бдительны!!!
Re: Ищется библиотека для сжатия с возможностью Seek
Конкатенация нескольких gzip-нутых файлов воспринимается как один gzip-нутый файл.
Поскольку размер изменяемого заголовка известен, делаем приблизительно так:
Открываем выходной файл (fd=open()).
Открываем gzip без сжатия (gzdopen(dup(fd), "w0")), записываем заголовок, закрываем gzip (но не исходный fd).
Открываем gzip с сжатием (gzdopen(dup(fd), "w0")), записываем данные. Если в процессе нужно обновить заголовок, запоминаем позицию оригинального дескриптора fd, переходим на начало, повторяем запись изменённого заголовка (с открытием/закрытием gzip-а), возвращаемся назад. Но лучше отложить это до конца записи, а изменения сохранять в памяти.
Закрываем gzip, закрываем дескриптор fd.
Можно и по другому, а может из-за каких-то деталей это не пройдёт. В крайнем случае можно на диск записать отдельными файлами сжатые данные и заголовок (можно тоже сжатый), а потом слить их.
Разрабатываемый мной софт создаёт образы дисков и томов в формате VHD.
Теперь требуется, чтобы файл образа на лету упаковывался в архив какого-нибудь популярного формата (zip, tar, bz2, ...).
Особенность создания файлов образа такова, что данные не всегда записываются последовательно байт за байтом. Например, пишется последовательно несколько гигабайт, а потом обновляется заголовок и служебные структуры, которые находятся в начале файла.
Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?
Re: Ищется библиотека для сжатия с возможностью Seek
Здравствуйте, dimb82, Вы писали:
D>Всем добрый день!
D>Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?
zlib, например. не совсем по произвольному, конечно, там идет окнами сжатие. как и во многих других библиотеках.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Ищется библиотека для сжатия с возможностью Seek
Здравствуйте, мыщъх, Вы писали: М>zlib, например. не совсем по произвольному, конечно, там идет окнами сжатие. как и во многих других библиотеках.
Я в zlib нашёл только функцию gzseek. Но, судя по описанию функции, она не подходит под описанные требования:
z_off_t gzseek (gzFile file, z_off_t offset, int whence);
Устанавливает начальную позицию для последующего вызова gzread или gzwrite на заданном сжатом файле. Параметр offset представляет количество байт в несжатом потоке данных. Параметр whence такой же, что и в lseek(2); значение SEEK_END не поддерживается.
Если файл открыт для чтения, эта функция эмулируется, что может происходить чрезвычайно медленно. Если файл открыт для записи, то поддерживается только смещение вперед. Если при сжатии gzseek попадется последовательность нулей, то указатель будет смещен на новую стартовую позицию.
Функция gzseek возвращает текущее положение курсора, измеряемое в байтах от начала некомпресованного потока данных, или -1 в случае ошибки, в частности, если файл был открыт для записи и новую позицию курсора нужно расположить перед текущей позицией.
То есть поддерживается только смещение вперёд. Мне же очень важно, чтобы поддерживалось смещение назад.
Или я смотрю не на ту функцию?
Re: Ищется библиотека для сжатия с возможностью Seek
Здравствуйте, dimb82, Вы писали:
D>Особенность создания файлов образа такова, что данные не всегда записываются последовательно байт за байтом. Например, пишется последовательно несколько гигабайт, а потом обновляется заголовок и служебные структуры, которые находятся в начале файла.
предлагаю подумать в этом направлении.
например, формировать VHD во временное место сначала (или даже в пункт назначения), а потом сжимать любым алгоритмом
Re[2]: Ищется библиотека для сжатия с возможностью Seek
Здравствуйте, BulatZiganshin, Вы писали:
BZ>для этого потребуется специально разработанный формат архива, с индексом
А есть существующие форматы с таким индексом?
Я бы мог встроить сжатие непосредственно в сам образ, но тогда бы получился совсем другой формат, нежели VHD, что нежелательно.
В формате VHD всё пространство виртуального диска делится на блоки фиксированного размера (обычно это 2МБ). В файл образа пишутся только использованные блоки (на которых есть полезные данные). Для хранения адресов блоков в файле образа используется внутренняя структура Block Allocation Table. Если бы я встраивал сжатие непосредственно в образ, то я бы сжимал каждый блок, при этом сохраняя размер сжатого блока. Если требуется обновить данные уже записанного блока, то я бы писал данные в конец файла образа (при невозможности обновить данные на старом месте), а потом просто менял адрес блока в Block Allocation Table. При этом, конечно, появлялось бы неиспользованное место в середине файла образа, но это допустимо для моей задачи.
Интересно, используется ли схожий подход в каком-либо из популярных форматов сжатия.
Re[2]: Ищется библиотека для сжатия с возможностью Seek
U>предлагаю подумать в этом направлении. U>например, формировать VHD во временное место сначала (или даже в пункт назначения), а потом сжимать любым алгоритмом
К сожалению, такой подход не подходит для данной задачи. Файл образа может занимать сотни гигабайт. Может просто не хватит свободного места для хранения и сжатой и несжатой версий файлов. К тому же это существенно увеличит время создания файла образа.
Re[3]: Ищется библиотека для сжатия с возможностью Seek
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, dimb82, Вы писали:
D>>А есть существующие форматы с таким индексом?
BZ>ntfs я таких форматов не знаю, поскольку для архивов это неактуально. так что придётся тебе делать это самому
А какже старый добрый стэкер и его аналоги? Нам насколько я понимаю там использовались простые алгоритмы сжатия типа LZW, симметричные по скорости компрессии/декомпрессии.
Re[5]: Ищется библиотека для сжатия с возможностью Seek