Свой ZIP на Delphi. Быстро, качественно, недорого!

Лозовский Александр

(klouniz@mail.ru)

Свой ZIP на Delphi. Быстро, качественно, недорого!

После выхода в свет Delphi 2 количество компонентов, содержащих функции разных архиваторов, стало увеличиваться в геометрической прогрессии. Уж не знаю, зачем это надо, но разнообразие стало пугающим: размер их варьировался в пределах от 30 Кб до 2 Мб, цена - от 0 до 299 долларов, а функций... В общем, очень много. До Delphi 4 эти компоненты постепенно прогрессировали и пополнялись новыми фичами, но вот потом наступил резкий спад. До 6 версии дожили, по моим подсчетам, около 4-5 достойных представителей. Это действительно монстры. Правда, XEEDZIP, который теперь весит 16 Мб, я так и не рискнул скачать, но в целом это функциональные и дорогие продукты, вполне достойные такого нищего кодера, как я :).

Сегодня мы будем пользоваться компонентом (вернее, целой коллекцией компонентов) под названием ZipTV. Я выбрал его потому, что там есть все, что нужно для работы с архивами. Он сравнительно мало весит и не содержит ничего лишнего. Зато есть кое-что и для настоящего ][. В конце концов, в нем отлично сочетаются простота и функциональность - научиться его использовать проще, чем двигать черепашку в LogoWr, а написать с его помощью WinZip - дело 10 минут. Нужно только немного мозгов, ловкость рук и никакого мошенничества.

Реквизит

Можешь забрать его с http://www.ziptv.com/download/ZipTV_u6_5.3.0.exe (он весит 2.08 Мб). Инсталляция его проходит безо всяких проблем. Главное - ставить его в пустую директорию (во избежание жертв), а после установки убедиться (посмотрев в tools-> environment options-> вкладка library) в том, что путь к этой самой директории там прописан. Иначе потом придется выяснять, почему компонент есть, а ничего не работает, и что это еще за "err_msgs.res" :). Если же проблемы все же возникнут, не спеши писать мне или разработчикам. Попробуй сначала почитать install.txt.

После установки можно полюбоваться на палитру компонентов. Там прибавились целых три закладки (ZTV Tools, ZTV Compress, ZTV Decompress), содержащие суммарно 35 (тридцать пять) компонентов! Вот это, я понимаю, королевский набор для работы с архивами!

ZTV Compress

1) TBlackHole. Предназначен для создания blackhole (*.bh) архивов.

2) TGZip. Позволяет создавать gzip архивы. Очень полезная вещь для юниксоидов :).

3) TJar, TLha, TCab, TTar. Соответственно, создают Jar, Lha и Tar архивы.

4) TUUEEncode. Создает UUE/XXE кодированные файлы для емайла.

5) TZip. Собственно, самый главный компонент в нашем обзоре. Он создает PkZip совместимые ZIP архивы.

После того, как я рассказал, зачем, собственно, нужны компоненты этой вкладки, возникает резонный вопрос - как их использовать? Также неплохо бы рассказать о некоторых методах, свойствах и событиях.

Создается архив довольно просто. Надо присвоить свойствам ArchiveFile (тип string, это имя будущего или имеющегося архива) и FileSpes (тип TStrings, содержит список файлов, подлежащих архивации; также можно использовать маски типа *.*) вразумительные значения, а затем с помощью метода Compress запустить процесс запаковки. Он вернет тебе переменную типа integer. Это и будет количество заархивированных файлов. Также можно добавить еще и свойство Password. Это будет пароль для архива. Будь осторожен с прописными и строчными буквами - они различаются.

ZTV Decompress

1) TUnACE, TUnARJ, TUnBH, TUnCab. Распаковывают, соответственно, ACE, ARJ, BH (BlackHole) и MS Cab архивы.

2) TUnGZIP. Распаковывает .gz, .z, .tar .jz архивы.

3) TUnJar, TUnLha, TunRar, TunTar, TUnZip. Разархивируют Jar (Java Soft формат), Lha, Rar, Tar, ZIP.

Процесс распаковки мало чем отличается от паковки. Здесь необходимо присвоить соответствующие значения для ArchiveFile, FileSpec и ExtractDir (определяет директорию, в которую надо распаковывать) и запустить распаковку с помощью метода Extract. На этот раз он вернет тебе количество распакованных файлов. ВНИМАНИЕ! TUnACE и TUnRAR требуют для своей работы библиотеки: unace.dll и unrar.dll соответственно.

ZTV Tools

1) TArc2Arc. Конвертирует архивы из формата в формат. Для этого нам понадобятся некоторые данные.

Свойства:

ArchiveFile - здесь пишется имя старого архива.

NewArchive - имя нового архива.

OutArcType - тип нового архива; например: tyZip, tyBH, tyLzh, tyCab.

OutArcMethod - способ конвертации.

IntegrityCheck - проводить ли проверку нового архива (true/false).

DateAttribute - какую дату присваивать файлам из нового архива.

Может быть:

daFileDate - те же даты, что и у файлов исходного архива.

daSysDate - системную дату.

daMaxFileDate - дату самого нового файла из архива.

Это свойство годится также и всем остальным компонентам.

Методы:

Activate - запускает процесс.

2) TMakeSFX. Создает Sfx архив из обычного.

Свойства:

ArchiveFile - имя обычного архива.

TargetFile - имя будущего Sfx’а.

SfxStubDir - определяет директорию с *.sfx файлами. Они необходимы для работы компонента (например, чтобы из Zip’а сделать SFX, нужен ZTV_Zip.SFX), а путь к ним по умолчанию - c:\windows\system\.

Метод CreateSfx запускает весь этот процесс.

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

Свойства:

ArchiveFile - определяет имя архива-телезвезды :).

FileSpec.Add - маска для запакованных файлов. Тип данных - TStrings.

FilesInArchive - список заархивированных файлов, соответствующий маске из предыдущего свойства. Тип тоже TStrings.

Count - количество запакованных файлов.

TotalUnpackedSize - исходный размер файлов.

TotalPackedSize - размер запакованных файлов.

Метод:

GetFileInfo - получает информацию о заархивированном файле. Например, такую:

ArchiveFile - его имя.

Date - дата. Легко приводится в божеский вид при помощи функции FormatDateTime. Это делается, к примеру, так: FormatDateTime( 'mm-dd-yy', ZipTV1.Date ). Она вернет тебе string, содержащий дату. То же самое и со временем.

PackedSize - его размер после паковки.

UnpackedSize - его исходный размер.

Ratio - compress ratio.

CRC - его CRC.

Вот такой веселый компонент. Если ты заглянешь в хелп-файл с именем tziptv.hlp, то узнаешь еще много нового.

4) TZipKey. Самый ][-компонент в моем обзоре :). Дело в том, что он, так сказать, помогает вспомнить забытые пароли. Сам понимаешь, есть запароленный архив, а пароль забыл, ну или не знал... Но узнать-то хочется! Вот и вперед. Для этого компонента есть очень хорошее демо (\ZIPZV5\DEMO\ZIPKEY\) и его надо освоить. Строго говоря, для многих компонентов есть демо, но не все они так хороши. В нелегком хакерском деле нам содействуют:

ArchiveFile - имя жертвы.

FileSpec - все та же маска для файлов.

CharSets - способ поиска паролей. Например, если присвоить Zipkey1.CharSets:= TCharSets(0), то поиск ограничится паролями, состоящими только из цифр. Если же вместо нуля будет 8, то поиск будет идти по всем ASCII символам. Все значения ты сможешь узнать из демы (в ней все очень понятно сделано), поскольку в хелпе этого компонента почему-то нет. Между прочим, поиск можно вести и по словарю. Их можно скачать на сайте разработчика в разделе "о продукте". Есть даже китайский wordlist. Тебе он, безусловно, пригодится.

StartPassword - с него начинается поиск.

Методы:

Activate - запускает процесс.

Pause - делает паузу :).

Как только пароль находится, вызывается событие OnFound и свойство Password приобретает конкретное значение. Им и предстоит воспользоваться.

На этом с обзором я заканчиваю, так что перейдем к моему любимому кодингу.

Интерфейс

Создавай форму (БОЛЬШУЮ форму, пример будет немаленьким) и клади на нее 5 TEdit, 12 TLabel, 7 TButton, 2 TListBox, 2 TProgressBar, 1 TGroupBox. Поскольку так просто разобраться в этом многообразии не могу даже я, давай посмотрим на этот рисунок:

 

Так примерно и должен выглядеть наш новорожденный проект. Самое время раздать свойства. Вот такие:

label1 - caption "Открыть/создать архив:"

label2 - caption "Пароль для архива"

label3 - caption "Путь для распаковки"

label4 - caption "Путь для новорожденного архива"

label5 - caption "Всего файлов:"

label7 - caption "Исходный размер:"

label9 - caption "Размер после паковки:"

label11 - caption "Ratio:"

Label'ы же под номерами 6, 8, 12 должны получить вместо caption'а просто нули, поскольку нормальные значения они получат только в ран-тайме. Кстати, пока не поздно, предупреждаю. Оформлением формы можешь не заниматься, так как на диске лежат 2 исходника: оформленная, но неработающая форма (в образовательных целях) и полностью готовый проект для нетерпеливых. Ладно, продолжим дизайнерство, набивай дальше:

Button'ы под номером 1 и 2 получают caption в виде троеточия. А вот остальные:

Button3 - caption "Добавить!"

Button4 - caption "Архивировать"

Button5 - caption "Разархивировать"

Button6 - caption "Создать SFX"

Button7 - caption "Конвертировать"

GroupBox1 получает caption "Содержимое архива".

Также не забудь определить на форму компоненты: Zip, UnZip, Arc2Arc, MakeSfx и OpenDialog из закладки Dialogs.

Вот что у меня получилось в результате:

Кодинг forever

Вначале разберемся с открытием архива и экранизацией его интимных тайн :). Для этого взгляни онклик первой кнопки (с троеточием):

 

Как всегда все просто и занудно. Если пользователь выбрал имя файла, мы передаем его ZipTv, присваиваем маску *.* и выводим в ListBox2 файлы по этой маске. То есть все файлы из архива. Затем выводим дополнительную информацию об архиве: количество файлов, исходный размер данных, пакованный размер и, наконец, compress ratio. Дело в том, что разработчики компонента придумали для этой цели целую функцию CalcRatio. Но до ее использования я никогда не унижусь :). Принять исходный размер за 100% и вычислить, сколько же осталось, это под силу даже школьнику из приюта для олигофренов. И это будет одна и та же строчка кода, так что тяга к упрощению ущемлена не будет :).

Архивариус

В первом listbox'е ты сможешь составить список файлов, подлежащих архивации. В этом нам поможет Edit2, Button2 и Button3 (которая "Добавить!", она добавляет содержимое Edit2 в ListBox1). Button2 же просто активирует OpenDialog и вводит имя файла в Edit2. Вот как это делается:

OnClick Button2:

ListBox1.Items.Add(Edit2.Text);

OnClick Button3:

ListBox1.Items.Add(Edit2.Text);

Впрочем, маски (типа *.exe, ??e.doc) тебе придется набивать в Edit2 уже вручную.

Посмотрим на ОнКлик кнопки "Архивировать":

 

Переменная i будет содержать количество запакованных файлов. Далее мы определяем имя архива, соотносим содержимое ListBox1 со свойством FileSpec и вставляем пароль из Edit3. Запускаем процесс и выводим результат с помощью ShowMessage.

Разархивариус

Вот онклик кнопки "Разархивировать":

 

Здесь все очень похоже на паковку, кроме нового свойства ExtractDir, данные для которого берутся из Edit4.

Создаем

Создать SFX архив из обычного не просто, а очень просто. Делается это в 3 строчки кода. Я имею в виду вот эти строчки:

MakeSfx1.ArchiveFile:= Edit1.Text;

MakeSfx1.TargetFile:= Edit5.Text;

IF MakeSfx1.CreateSfx then ShowMessage ('Архив создан!');

Это и есть Онклик от кнопочки "Создать SFX". Путь к конечному файлу будет определяться содержимым Edit5. Не забудь, что по умолчанию SFX файлы ищутся в системном каталоге.

Конвертируем

Вот как это делается:

 

Если ты внимательно читал теорию, то уже все понял: здесь я последовательно определяю исходный и конечный файлы, выбираю способ конвертации. Вот, собственно, и весь пример. Самое время чуть-чуть его модернизировать. Не зря же я положил на форму 2 TProgressBar :).

Создай для компонента TZip1 событие OnProgress и вбей туда следующее:

ProgressBar1.Position := ProgressByFile;

ProgressBar1.Update;

ProgressBar2.Position := ProgressByArchive;

ProgressBar2.Update;

Эти простые строчки обеспечат пользователю наблюдение за двумя важными процессами: прогрессом в архивации текущего файла и архива в целом.

Клинические испытания

Я запустил нашу прогу и открыл один из своих архивов, получив краткую информацию о нем. Затем у меня появилось желание добавить в него файлик, что я и сделал с неплохим результатом - compress ratio был что-то около 34%.

В данной ситуации это нормально для ZIP алгоритма в любой его реализации. А вот RAR справился лучше - 25% и никаких гвоздей. До сих пор удивляюсь популярности WinZip. Неужели Drag'n'Drop так притягивает пользователей?

Final Prayer

Вот и все на сегодня. Остальное оставляю на откуп читателям: чтение хелп-файла к компонентам (правда, там есть не все и он на английском) и освоение демо. После этого можно будет считать себя компетентным специалистом в области архивирования данных. Без дураков - ведь заказчику неважно, КАК ты будешь делать прогу. Важно, КАК СКОРО она будет написана и НАСКОЛЬКО ФУНКЦИОНАЛЬНА она будет. Как говаривал Horrific : "Не надо изобретать велосипед и терять время, переписывая то, что сделано до тебя в виде компонентов".



Опубликовал admin
11 Ноя, Вторник 2003г.

Комментарии

Здравствуйте, исходников случайно у вас не осталось архиватора ???




Программирование для чайников.