Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Архивация файлов с помощью zlib


Автор: Демидрол 13.1.2009, 12:24
Доброе время суток всем. У меня есть задача:необходимо с помощью билдера заахивировать некоторые файлы. Билдер версии 6.0, поэтому втроенного архиватора прямо в билдер не имею. Нашел в сети zlib.lib, описание про неё - вроде то, что мне нужно, но...при её подключении получаю ошибку:
[Linker Error] 'F:\PROJECT\ZLIBCOMPRESS\ZDLL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
понимаю, что неподходит тип - билдеру нужен другой, т.е. нужно из OMF переделать в COFF, но как это сделать - не знаю.Помогите, пожалуйста. И если кто-нибудь занимался этой проблемой, то буду очень благодрен за прмер применения сей библиотеки. Заранее спасибо.

Автор: xvr 13.1.2009, 13:12
Возьми сорцы с www.zlib.org и собери их под Builder, тогда и .lib будет правильный  smile 

Автор: Alexeis 13.1.2009, 14:05
Демидрол, так есть же VCL овский TCompressionStream/TDecompressionStream

Код

#include "ZLib.hpp"

...........

  TFileStream *F = new TFileStream("some.txt", fmOpenRead);
  TCompressionStream *t = new TCompressionStream(Zlib::clMax, F);

..........


Добавлено через 1 минуту и 1 секунду
P.S. TCompressionStream/TDecompressionStream - это по сути обертка над zlib, потому формат тот же.

Автор: xvr 13.1.2009, 15:47
Цитата(Alexeis @ 13.1.2009,  14:05)
Демидрол, так есть же VCL овский TCompressionStream/TDecompressionStream

Нету, у него BCB 6.0. 
ZLib.hpp появился только в BDS 200? (наверное 2006)

Автор: Демидрол 13.1.2009, 16:19
Цитата(xvr @  13.1.2009,  15:47 Найти цитируемый пост)
Цитата(Alexeis @ 13.1.2009,  14:05)
Демидрол, так есть же VCL овский TCompressionStream/TDecompressionStream



Нету, у него BCB 6.0. 
ZLib.hpp появился только в BDS 200? (наверное 2006)


Дада))В этом-то и проблема)))
А ещё...мммм....я длл делать не умею, поэтому подскажите, если не сложно, как переделать zlib.dll в библиотеку, на которую билдер не будет ругацца....

Автор: orthrus 13.1.2009, 17:01
Значит на офф. сайте скачиваешь http://www.zlib.net/zlib-1.2.3.tar.gz, распаковываешь например на диск С:. Открываешь cmd.exe, заходишь в эту диру такой командой:
Код

cd C:\zlib-1.2.3\

дальше набираешь команду следующего содержания:
Код

make -f win32/Makefile.bor

должна произойти сборка либы

Автор: Alexeis 13.1.2009, 17:06
Цитата(Демидрол @  13.1.2009,  15:19 Найти цитируемый пост)
Дада))В этом-то и проблема)))
А ещё...мммм....я длл делать не умею, поэтому подскажите, если не сложно, как переделать zlib.dll в библиотеку, на которую билдер не будет ругацца.... 

  Можно загрузить Dll динамически при помощи LoadLibrary

Добавлено @ 17:06
Кроме того есть тулза которая делает lib файл по имеющейся Dll. Implib кажется называется тулза.

Автор: Демидрол 13.1.2009, 17:39
Цитата(orthrus @  13.1.2009,  17:01 Найти цитируемый пост)
Значит на офф. сайте скачиваешь zlib-1.2.3.tar.gz, распаковываешь например на диск С:. Открываешь cmd.exe, заходишь в эту диру такой командой:
Без подсветки
1:
cd C:\zlib-1.2.3\
дальше набираешь команду следующего содержания:
Без подсветки
1:
make -f win32/Makefile.bor

должна произойти сборка либы 


А где команды набирать?????

Автор: orthrus 13.1.2009, 17:42
Пуск->Выполнить->Ввести cmd и нажать ОК, откроется текстовая консоль там и вводить

Автор: Демидрол 13.1.2009, 18:01
orthrus, ОООООООО!!!!!!!!!!!!пасиба!!!!!!!Такие штуки научил делать........оооооооооооооо!!!!!!!!!!Пасиба!!!!!!!!!!

Автор: Dem_max 13.1.2009, 19:33
Цитата

[Linker Error] 'F:\PROJECT\ZLIBCOMPRESS\ZDLL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

http://forum.sources.ru/index.php?showtopic=84442&hl=contains,and,invalid,and,omf
http://forum.sources.ru/index.php?showtopic=153041&hl=contains,and,invalid,and,omf
COFF- формат мелкомягких,
OMF - интеловский вроде но его использует борланд.

Автор: Демидрол 19.1.2009, 12:14
Поискал ещё в сети и нашл исходники, с помощью которых можно создавать zip-архивы.Но разобрался только, как архиировать отдельные файлы, а как запаковывать папки не понял, хотя распаковывается архив с папками нормально...Знаний, наверное, не хватает. Если кому-нибудь не сложно, помогите разобраться.Файлы добавлю к сообщени, если кому надо, а ниже приведу пример использования.

Архивация:
Код

       HZIP hz = CreateZip(PackName,0);
       ZipAdd(hz,"file1.rtf", FileName );
       //ZipAdd(hz,"file2.rtf", FileName);   // В АРХИВ МОЖНО УПАКОВЫВАТЬ НЕКОЛЬКО ФАЙЛОВ
       CloseZip(hz);


Разархивация:
Код

       HZIP hz = OpenZip(PackName,0);
       ZIPENTRY ze;
       for (int zi=0; zi<numitems; zi++)
       {
          ZIPENTRY ze; GetZipItem(hz,zi,&ze); // fetch individual details
          UnzipItem(hz, zi, ze.name);         // e.g. the item's name.
       }
       CloseZip(hz); 

Автор: Alexeis 19.1.2009, 12:20
Демидрол, сам не пробовал, но по идее если указать относительные пути к файлам, т.е. "Folder\\file.ext" вместо имен "file1.rtf", то заархивируется как папка внутри архива.

Автор: mrbrooks 19.1.2009, 12:21
Демидрол, глянь http://forum.vingrad.ru/forum/topic-84858/anchor-entry652493/0.html Тут дельфяцких дел мастер реализовал то что тебе нужно.

Автор: Демидрол 19.1.2009, 14:12
Alexeis, понятно, если указывать путик файлам, то они запакуются))Я не знаю, а можно ли запаковать папку таким образом, чтобы указать только её название, например, "Folder".....

Добавлено через 3 минуты и 38 секунд
mrbrooks, спасибо, но в том примере плотность сжатия невелика, 3% примерно, а мне надо именно сжимать файлы, то, что я нашол очень хорошо для этого, так как при тестировании дало хорошие результаты, только не могу понять, как папки архивироватьцеликом, а не отдельно по файлику архивировать содержимое.)))

Автор: Alexeis 19.1.2009, 14:44
Цитата(Демидрол @  19.1.2009,  13:12 Найти цитируемый пост)
Я не знаю, а можно ли запаковать папку таким образом, чтобы указать только её название, например, "Folder"

  Т.е. пустую паку? Теоретически да, поскольку папка это тоже файл. Но проверять нужно все. В данной конкретной реализации это может не работать.

Автор: Демидрол 19.1.2009, 14:57
Alexeis, нет, я имею ввиду, что есть, допустим, папка и в ней содержится 10 файлов. И не могу понять, как загнать в архив папку целиком сразу, а не отдельно по файлу, таким образом, чтобы не делать 10 архивов, в каждом из которых будет по одному файлу из исходной папки, а чтобы был один архив, в котором лежит папка с десятью файлами.Как это сделасть отдельно по файлам я понимаю, а как сделать, чтобы просто указать название папки, я не знаю.

Автор: Alexeis 19.1.2009, 15:03
Цитата(Демидрол @  19.1.2009,  13:57 Найти цитируемый пост)
И не могу понять, как загнать в архив папку целиком сразу, а не отдельно по файлу, таким образом, чтобы не делать 10 архивов, в каждом из которых будет по одному файлу из исходной папки

  Так просто добавлять файлы в один и тот же архив. Каждый файл с его относительным путем.
Цитата(Демидрол @  19.1.2009,  13:57 Найти цитируемый пост)
Как это сделасть отдельно по файлам я понимаю, а как сделать, чтобы просто указать название папки, я не знаю. 

  Такого может и не быть. Не вижу проблемы, обход дерева папок это типовой алгоритм.

Только вот еще такой момент, если это zip, то у него вроде ANSI кодировка, потому могут быть траблы с порчей имен папок в которых есть названия на языке отличном от английского, и там еще ограничение на максимальную длину пути, т.е. могут быть проблемы с именами сохранных веб страниц или при глубокой вложенности.  

Автор: xvr 19.1.2009, 15:11
Цитата(Демидрол @ 19.1.2009,  12:14)
Поискал ещё в сети и нашл исходники, с помощью которых можно создавать zip-архивы.Но разобрался только, как архиировать отдельные файлы, а как запаковывать папки не понял, 

ZipAddFolder

Автор: Демидрол 19.1.2009, 15:23
xvr, это я знаю.НО!!!!Эта функция просто в архиве создает пустую папку, в которую можно будет копировать.
Вот так в архив добавляется существующий файл и пустая папка:
Код

       HZIP hz = CreateZip(PackName,0);
       ZipAdd(hz,"file1.rtf", "file1.rtf");
       ZipAddFolder (hz, "Folder");

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)