Архивирование данных в приложениях на MS Visual FoxPro

Предистория

Под созданием архивов подразумевается создание копий баз данных, таблиц, индексов и прочих файлов в сжатом виде. Использование консольных архиваторов типа PKZIP и PKUNZIP раздражает открытием окна сессии MSDOS. Хотелось найти что-нибудь 32-разрядное. В Инете предлагается некоторое количество подобных решений, например:

BigSpeedZip DLL - the faster and the smallest compression libraryВсе они SHAREWARE или EVALUATION. А хочется бесплатного... Тут и вспомнился GNU Project - Free Software Foundation (FSF), где обнаружилась библиотека ZLIB версии 1.13. В том числе и для Windows в самых разных видах:

 

The 16 bits DLL of ZLib 1.13 The 16 bits import library for the DLL of ZLib 1.13  The 32 bits DLL of ZLib 1.13 The 32 bits import library for the DLL of ZLib 1.13 The 32 bits static library of ZLib 1.13 for Visual C++ The 32 bits import library for the DLL of ZLib 1.13 for Borland C++  The 32 bits DLL of ZLib 1.13 for WinNT on Dec Alpha The 32 bits import library for the DLL of ZLib 1.13 for WinNT on Dec Alpha The 32 bits static library of ZLib 1.13 for Visual C++ for WinNT on Dec Alpha

Для нашей задачки подходит третья в списке. Творчески переработав файл ZLIB.H получаем программку для VFP, регистрирующую некоторые функции из ZLIB.DLL

 

DECLARE INTEGER gzopen IN zlib STRING cPath, STRING cMode DECLARE INTEGER gzread IN zlib INTEGER iFileID, STRING @cBuffer, LONG lLength DECLARE INTEGER gzwrite IN zlib INTEGER iFileID, STRING @cBuffer, LONG lLength DECLARE INTEGER gzeof IN zlib INTEGER iFileID DECLARE INTEGER gzclose IN zlib INTEGER iFileID

Этого набора вполне достаточно, чтобы написать функции ZipFile и UnzipFile для компрессии/декомпресии отдельного файла. Никаких ZIP-архивов... Что, впрочем, понятно, если вспомнить о UNIX происхождении библиотеки. Ну и ладно... Вот только как именовать получающиеся сжатые файлы? Если следовать принципам UNIX, то нужно просто к исходному имени файла добавить еще одно расширение - GZ, то есть

 

MAIN.DBF --> MAIN.DBF.GZ

Вопрос только в том, чтобы Windows "переварила" такое издевательство... Пробуем и убеждаемся, что Windows не только спокойно относится к таким именам файлов, но и правильно интерпретирует их. То есть под расширением фала понимается именно GZ, а не DBF.GZ. К тому же при установленном WinZip эти файлы отображаются в виде иконок архива и открываются с легкостью.

Теперь пишем функции ZipDir и UnzipDir, добавляем простенький индикатор типа ProgressBar и оформляем все это в виде библиотеки VCX.

Как пользоваться всем этим?

  1. Скачиваем архив zlib.zip
  2. Копируем 32-разрядную ZLIB.DLL в папку WindowsSystem (или WinNTSystem32)
  3. Помещаем ZLIB.VCX и ZLIB.VCT в папку с проектом
  4. Открываем VFP и указываем путь к библиотеке
     SET CLASSLIB TO <path>ZLIB.VCX ADDITIVE
  5. Создаем объект
     z=CreateObject("zlib")
  6. Пользуемся им с помощью методов ZipFile, UnzipFile, ZipDir, UnzipDir. Синтаксис смотри ниже.
  7. Удаляем объект
     RELEASE z

Синтаксис методов класса ZLIB

Object.ZipFile(cSrcFile,cDestFile)
Object.UnzipFile(cSrcFile,cDestFile)

cSrcFile - исходный файл
cDestFile - сжатый файл

Возвращают результат .T. если все хорошо, или .F. в противном случае

Обе функции ничего не производят с именами файлов, поэтому исходный и сжатый файлы должны быть разными. Рекомендуется сжатым файлам назначать расширение GZ.

Object.ZipDir(cSrcPath,cDestPath)

cSrcFile - путь к папке с файлами
cDestFile - путь к папке куда помещаются сжатые файлы

Возвращает число обработанных файлов если все хорошо, или -1 в противном случае

Функция обрабатывает файлы с атрибутом A по маске *.*
Сжатые файлы имеют расширение GZ, а первая точка меняется на подчеркивание (из соображений совместимости). Например

 

 MAIN.DBF --> MAIN_DBF.GZ

 

Object.UnzipDir(cSrcPath,cDestPath)

cSrcFile - путь к папке со сжатыми файлами
cDestFile - путь к папке куда помещаются распакованные файлы

Возвращает число обработанных файлов если все хорошо, или -1 в противном случае

Функция обрабатывает файлы с атрибутом A по маске *.GZ
У конечных файлов удаляется расширение GZ и подчеркивание меняется на точку, то есть возвращается исходное расширение.


Автор: Илья Тепликов
E-mail: itp@karelia.ru

Автор публикации

не в сети 2 месяца

Joys

2
Комментарии: 4Публикации: 227Регистрация: 25-06-2000
0
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 41,18 КБ zlib
Оставить комментарий
Авторизация
*
*
Генерация пароля