Свій zip на delphi

Свій ZIP на Delphi. Швидко, якісно, ​​недорого!

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

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

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

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

2) TGZip. Дозволяє створювати gzip архіви. Дуже корисна річ для юніксоід :).

3) TJar, TLha, TCab, TTar. Відповідно, створюють Jar, Lha і Tar архіви.

5) TZip. Власне, найголовніший компонент в нашому огляді. Він створює PkZip сумісні ZIP архіви.

Після того, як я розповів, навіщо, власне, потрібні компоненти цієї вкладки, виникає резонне питання - як їх використовувати? Також непогано б розповісти про деякі методи, властивості і події.

Створюється архів досить просто. Треба присвоїти властивостями ArchiveFile (тип string, це ім'я майбутнього або наявного архіву) і FileSpes (тип TStrings, містить список файлів, що підлягають архівації; також можна використовувати маски типу *. *) Зрозумілі значення, а потім за допомогою методу Compress запустити процес запаковування. Він поверне тобі змінну типу integer. Це і буде кількість файлів, що заархівували. Також можна додати ще й властивість Password. Це буде пароль для архіву. Будь обережний з великими та малими буквами - вони розрізняються.

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 відповідно.

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.

Ось такий веселий компонент. Якщо ти заглянеш в хелп-файл з ім'ям 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.

Ось що у мене вийшло в результаті:

Спочатку розберемося з відкриттям архіву і екранізацією його інтимних таємниць :). Для цього поглянь онклік першої кнопки (з трикрапкою):

Як завжди все просто і занудно. Якщо користувач вибрав ім'я файлу, ми передаємо його ZipTv, присвоюємо маску *. * І виводимо в ListBox2 файли з цієї масці. Тобто всі файли з архіву. Потім виводимо додаткову інформацію про архів: кількість файлів, вихідний розмір даних, пакувати розмір і, нарешті, compress ratio. Справа в тому, що розробники компонента придумали для цієї мети цілу функцію CalcRatio. Але до її використання я ніколи не принижуючи :). Прийняти вихідний розмір за 100% і обчислити, скільки ж залишилося, це під силу навіть школяреві з притулку для олігофренів. І це буде одна і та ж рядок коду, так що тяга до спрощення ущемлена НЕ буде :).

У першому ListBox'е ти зможеш скласти список файлів, що підлягають архівації. У цьому нам допоможе Edit2, Button2 і Button3 (яка "Додати!", Вона додає вміст Edit2 в ListBox1). Button2 ж просто активує OpenDialog і вводить ім'я файлу в Edit2. Ось як це робиться:

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

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

Мінлива i буде містити кількість запакованих файлів. Далі ми визначаємо ім'я архіву, співвідносимо вміст ListBox1 з властивістю FileSpec і вставляємо пароль з Edit3. Запускаємо процес і виводимо результат за допомогою ShowMessage.

Ось онклік кнопки "Розархівувати":

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

Створити SFX архів зі звичайного не просто, а дуже просто. Робиться це в 3 рядки коду. Я маю на увазі ось ці рядки:

IF MakeSfx1.CreateSfx then ShowMessage ( 'Архів створено!');

Це і є Онклік від кнопочки "Створити SFX". Навігація автомобілем до файлу буде визначатися вмістом Edit5. Не забудь, що за замовчуванням SFX файли шукаються в системному каталозі.

Ось як це робиться:

Якщо ти уважно читав теорію, то вже все зрозумів: тут я послідовно визначаю вихідний і кінцевий файли, вибираю спосіб конвертації. Ось, власне, і весь приклад. Саме час трохи його модернізувати. Не дарма ж я поклав на форму 2 TProgressBar :).

Створи для компонента TZip1 подія OnProgress і вбий туди наступне:

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

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

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

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

Схожі статті