Створення архіватора або простого пакувальника даних
Владислав Петровський Створення архіватора або простого пакувальника даних
Сподіваюся пояснювати, що таке архіватор чи пакувальник даних не треба. Надалі вважатимемо архіватор пакувальником даних із можливістю стиснення. Отже, необхідно відразу розібратися, що має робити наша майбутня програма. По-перше, програма повинна вміти упаковувати та розпаковувати файли будь-яких форматів. По-друге, вона повинна мати інтуїтивно-зрозумілий інтерфейс, а також мати деякі додаткові функції, такі як паролювання, кодування, розбивка архіву (пакету) на кілька частин. Особисто я, як ігровий програміст, робив простий пакувальник, завдання якого було запакувати 3ds-модель, текстури та аніматори в один файл. Але, якщо хочете, ви можете робити архіватор. Тоді вам знадобляться алгоритми стиснення. Тепер розберемося, який буде інтерфейс. Я робив консольну утиліту, але в даному випадку не вважаю, що консольний інтерфейс є інтуїтивно-зрозумілим, та й у VB6 робота з консоллю можлива лише за допомогою API. Тому використовуємо віконний, SDI (Single Document Interface), ListView, ToolBar, StatusBar та меню. Взагалі думаю, що кожен сам може визначити яким буде інтерфейс його застосування, а ми займемося найголовнішим - механізмом упаковки, розпакування, і форматом файлу. Спочатку давайте визначимося, як зберігатимуться дані всередині програми. Я вважаю, що це має бути колекція елементів класу CArhFile. Давайте використати такий код для класу.
Звичайна колекція – як решта, але є дві функції Add… - AddFile і AddItem. 1-а функція додає в колекцію елемент, знаючи тільки шлях файлу, - все інше вона визначає сама. Друга додає вже готові дані. 1-я зазвичай використовується, коли користувач додає файл до архіву, адруга – під час завантаження архіву.
Формат файлу
CopyMemory
Цей код теоретично працездатний, але якщо ви скопіюєте його в VB IDE - отримаєте помилку (35) Sub or Function not defined. Чому? Тому що функція OverWriteQuery ще не описана. Функція запитує користувача, чи потрібно переписати файл, якщо він існує. Функція виглядає так:
Як усім цим користуватися
Щоб завантажити архів: Потрібно скористатися LoadFile. Передаєте їй три аргументи - ім'я файлу, порожню змінну типу T_ARHIVE_HEADER, порожній масив змінних типу T_FILE_HEADER. Після виконання функції змінна та масив будуть заповнені необхідною інформацією про архів. Крім цього, колекція aFiles також буде містити в собі інформацію і сам вміст файлів. Тобто. після завантаження, звертаєтеся до функції-члена ExtractFile будь-якого елемента колекції, і потрібний вам файл опиниться там, де потрібно, тобто. витягнеться. Тут треба пам'ятати, що якщо ви отримуєте відразу весь архів, то аргумент Relative функції ExtractFile повинен дорівнювати True, що означає, що відносні шляхи (до архівування) файлу, що витягується при розпакуванні потрібно зберегти. Заархівували ви, наприклад, папку Crack, а в ній був файл Cracker.exe і ReadMe.TxT. Так от, якщо Relative буде False, то при розпакуванні (на Робочий стіл, наприклад) цього архіву, у вас на робочому столі виявиться порожня папка «Crack», і поряд ще 2 файли, здогадалися яких? Тобто. якщо Relative буде False всі файли та папки, незалежно від їх вкладеності, будуть розміщені в одне місце. І другий момент – спочатку мають бути вилучені усі папки, потім усі файли. Це потрібно для того, щоб при розпаковуванні папка зберігала свої атрибути, які були перед тим, як її «запхали» в архів. Щоб зберегти архів: Всі файли тапапки до архіву додаються за допомогою функції AddFile об'єкта aFiles незалежно від того, папка це чи файл. Коли захочете зберігати файл, заповніть масив FH() і bData() інформацією про файли та вміст файлів відповідно. Див. функцію LoadFile, там робиться те саме, але навпаки. Функція CopyMemory знову прийде на допомогу. Коли все заповните, викликайте функцію SaveFile.
Висновок
Цей код, звичайно ж, ще не обтесаний - потрібно ще доопрацьовувати, покращувати, щось переробити. Це залежить лише від того, що ви збираєтеся робити: шараварну програму типу WinRAR'а, утиліту-одноденку або просто хочете поекспериментувати з архівами. Навіть якщо ви просто прочитали це, і вважаєте, що недаремно витратили 5 хвилин – це вже добре.