FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9145
Вход
Архивирование данных в приложениях на MS Visual FoxPro

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


 
Прислал: Илья Тепликов   Категория: Разное


Архивирование данных в приложениях на 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. Копируем 32-разрядную ZLIB.DLL в папку Windows\System (или WinNT\System32)
  2. Помещаем ZLIB.VCX и ZLIB.VCT в папку с проектом
  3. Открываем VFP и указываем путь к библиотеке
    SET CLASSLIB TO <path>ZLIB.VCX ADDITIVE
    
  4. Создаем объект
    z=CreateObject("zlib")
    
  5. Пользуемся им с помощью методов ZipFile, UnzipFile, ZipDir, UnzipDir. Синтаксис смотри ниже.
  6. Удаляем объект
    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

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.804) Вложение [41.18]kb
Дополнения пользователей
Архивирование данных в приложениях на MS Visual FoxPro
[+][?]
Boba
06.04.01 09:34:33

Freeware да еще и удобное !
Спасибо!!!
Igor_pl
24.04.01 10:17:39

Чего удобного, когда архивируется каждый файл по отдельности и нельзя создать общий архив.
Filippow@t-online.de
08.05.01 14:44:21

Спасибо, очень пригодилось!
Модернизировал и работает вовсю!
Vlad
31.05.01 16:43:57

Потенциал для работы с подсетями по медленному каналу очень высок
Bykov V. Konstantin
15.10.03 14:42:11

У меня так и не получилось протестировать - ZLIB.VCX has become corrupted. The table will need to
be repaired before using again.
Bykov V. Konstantin
27.04.04 09:59:11

Если у Вас выскакивает сообщение о "битом" классе, то я перелопатил код:

http://www.foxclub.ru/sol/index.php?act=view&id=340

В остальном же, повторяю, мое решение - копия этого.
Перминов Игорь
24.10.03 11:12:18

Библиотека битая.
Протестировать неудалось...
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика