為Visual FoxPro應(yīng)用程序增加文件壓縮功能
發(fā)布時(shí)間:2008-08-09 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
[簡(jiǎn)介]
壓縮文件可以認(rèn)為是一個(gè)包裝文件的容器。通過(guò)文件壓縮,大量文件可以被打包起來(lái)并當(dāng)作一個(gè)文件來(lái)看待。此外,壓縮文件在尺寸上普遍比原文件小,如文本文件在壓縮以后的平均大小是原來(lái)的40%。因此,文件壓縮能夠大幅度的節(jié)省存儲(chǔ)空間和網(wǎng)絡(luò)傳輸時(shí)間,從而使得文件的攜帶和傳輸更加方便快捷。
在DOS環(huán)境下,經(jīng)常使用到的壓縮程序是ARJ、RAR和PKZIP/PKUNZIP。在Windows環(huán)境下,經(jīng)常使用到的壓縮軟件是WinZip和CleverZip。這些軟件基本上都是共享軟件,都可以從網(wǎng)絡(luò)上免費(fèi)獲取。
在數(shù)據(jù)庫(kù)應(yīng)用程序中,經(jīng)常需要對(duì)數(shù)據(jù)文件進(jìn)行壓縮備份或者從壓縮文件中恢復(fù)。以Visual FoxPro為例,通常的做法是通過(guò)FoxPro語(yǔ)句調(diào)用壓縮軟件,然后在該壓縮軟件的操作界面上進(jìn)行文件壓縮或者文件恢復(fù)。這種做法不僅在操作界面上非常不友好,而且大大地削弱了應(yīng)用程序的整體性。以下介紹的FoxPro程序利用了兩個(gè)共享的動(dòng)態(tài)鏈接庫(kù)AZIP.DLL和AUNZIP.DLL在Visual FoxPro內(nèi)部實(shí)現(xiàn)了文件壓縮與解壓縮功能,從而較好地解決了這個(gè)問(wèn)題。
文件壓縮程序
* 程序名稱:AZIP.PRG
* 程序說(shuō)明:在Visual FoxPro中實(shí)現(xiàn)文件壓縮
* 程序要求:AZIP32.DLL放置在Windows的System目錄或當(dāng)前目錄下
* 使用方法:USAGE: AZIP(lInitialize, sArchive, sInclFiles[, ZipParams])
* 參數(shù)說(shuō)明:
--lInitialize:.T. – 第一次使用本程序,.F. – 非第一次使用本程序
--sArchive: 帶有擴(kuò)展名的壓縮文件名,如"C:\THISFILE.ZIP"
--sInclFiles:需要壓縮的文件名稱,不同文件名之間有一個(gè)空格
例1: "D:\CUSTDATA.DBF"
例2: "C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*"
--ZIPparams:文件壓縮參數(shù)[可選]
e(x) x = 'X' 最大程度壓縮
x = '0' 無(wú)壓縮
x = 'S' 最小程度壓縮
x = 'N' 普通壓縮(缺省)
P 包括目錄信息
S 使用密碼(必須是最后一部分)
* 示范語(yǔ)句:AZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc")
* 返回參數(shù):被壓縮的文件數(shù)目,如果沒(méi)有指定文件名則返回-1
* 接受參數(shù)
PARAMETERS lInitialize, sArchive, sInclFiles, ZIPparams
PRIVATE Params, sTemp
Params = PARAMETERS()
* 聲明需要調(diào)用的DLL函數(shù)并使當(dāng)前窗口獲得焦點(diǎn)
IF Params = 0 OR lInitialize
PRIVATE HWND
DECLARE INTEGER GetActiveWindow IN win32api
HWND = GetActiveWindow()
DECLARE addZIP_Initialise IN AZIP32
DECLARE SHORT addZIP_SetParentWindowHandle IN AZIP32 SHORT @ HWindow
DECLARE SHORT addZIP_ArchiveName IN AZIP32 STRING @ sArchName
DECLARE SHORT addZIP_Include IN AZIP32 STRING @ sFileName
DECLARE SHORT addZIP_Recurse IN AZIP32 SHORT @ nRecurse
DECLARE SHORT addZIP_SetCompressionLevel IN AZIP32 SHORT @ nComprLvl
DECLARE SHORT addZIP_IncludeDirectoryEntries IN AZIP32 SHORT @ nInclDir
DECLARE SHORT addZIP_IncludeEmptyDirectoryEntries IN AZIP32 SHORT @ nInclEDir
DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
DECLARE SHORT addZIP IN AZIP32
DECLARE SHORT addZIP_Register IN AZIP32 String @ RegName, Integer @ RegNum
DECLARE SHORT addZIP_Encrypt IN AZIP32 STRING @ sPassw
addZIP_Initialise()
addZIP_SetParentWindowHandle(HWND)
* 如果使用的是本動(dòng)態(tài)鏈接庫(kù)的注冊(cè)版本,則可以添加下面一行
addZIP_Register("RegistrationName", RegistrationNumber)
* 其作用是在壓縮文件中使用密碼保護(hù)
* 如果沒(méi)有指定壓縮文件名,則返回0(沒(méi)有文件被壓縮)
IF Params < 2
RETURN 0
ENDIF
ENDIF
* 如果沒(méi)有指定被壓縮文件名,則響鈴并返回0(沒(méi)有文件被壓縮)
IF Params < 3
?? CHR(7)
MESSAGEBOX('缺少操作參數(shù)!',0, 'AZip 警告!')
RETURN 0
ENDIF
* 如果指定了文件壓縮參數(shù),按照參數(shù)進(jìn)行壓縮選擇
IF Params > 3
ZIPparams = ALLT(ZIPparams)
PRIVATE LastPos, PASSWORD, nCurPos
LastPos = LEN(ZIPparams) + 1
* 檢查是否存在壓縮密碼
nCurPos = ATC('S', ZIPparams)
IF nCurPos > 0
cPassWord = SUBSTR(ZIPparams, nCurPos+1)
addZIP_Encrypt(cPassWord)
ZIPparams = LEFT(ZIPparams, nCurPos -1)
ENDIF
* 檢查是否保存目錄信息
nCurPos = ATC('P', ZIPparams)
IF nCurPos > 0
addZIP_Recurse(1)
addZIP_IncludeDirectoryEntries(1)
ENDIF
* 檢查文件壓縮的程度
nCurPos = ATC('E', ZIPparams)
IF nCurPos > 0
PRIVATE cCompLevel, nCompLevel
cCompLevel = SUBSTR(ZIPparams, nCurPos + 1, 1)
DO CASE
* 最大程度壓縮
CASE cCompLevel = 'X'
nCompLevel = 3
* 最小程度壓縮
CASE cCompLevel = 'S' && min compression
nCompLevel = 1
* 沒(méi)有壓縮
CASE cCompLevel = '0' && no compression
nCompLevel = 0
* 正常壓縮
OTHERWISE && normal/default compression
nCompLevel = 2
ENDCASE
addZIP_SetCompressionLevel(nCompLevel)
ENDIF
ELSE
addZIP_SetCompressionLevel(2)
ENDIF
* 指定壓縮文件的路徑
addZIP_ArchiveName(sArchive)
* 檢查需要進(jìn)行壓縮的文件
sInclFiles = ALLT(STRTRAN(sInclFiles, ' ', '|'))
* 建立壓縮文件信息
addZIP_Include(sInclFiles) && (sInclFiles)
* 壓縮文件并返回被壓縮的文件數(shù)目
Return addZIP()
文件解壓縮程序
* 程序名稱:AUNZIP.PRG
* 程序說(shuō)明:在Visual FoxPro中實(shí)現(xiàn)文件解壓縮
* 程序要求:AUNZIP32.DLL放置在Windows的System目錄或當(dāng)前目錄下
* 使用方法:AUNZIP(lInitialize, sArchive sDir[, sExtractFiles[, UnZIPparams]])
* 參數(shù)說(shuō)明:
* lInitialize:.T. – 第一次使用本程序,.F. – 非第一次使用本程序
* sArchive: 帶有擴(kuò)展名的壓縮文件名,如"C:\THISFILE.ZIP"
* sDir: 目標(biāo)目錄,如"D:\TEMP"
* sExtractFiles:需要進(jìn)行解壓縮的文件名稱[可選],不同文件名之間有一個(gè)空格
* 缺?。?quot;*.*"
* 例1:"C:\CUSTOMER.DBF"
* 例2:"C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*"
* UnZIPparams:壓縮參數(shù)[可選]
* F 文件更新
* D 包括目錄信息
* OA 全部覆蓋(缺?。?br>
* O0 不覆蓋
* OU 提問(wèn)是否覆蓋
* S 使用密碼 (必須是最后一部分)
* 示范語(yǔ)句:AUNZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc")
* 返回參數(shù):被解壓縮的文件數(shù)目,如果沒(méi)有指定壓縮文件名則返回-1
* 接受參數(shù)
PARAMETERS Initialize, sArchive, sDir, sExtractFiles, UnZIPparams
PRIVATE Params, sTemp
Params = PARAMETERS()
* 聲明需要的動(dòng)態(tài)鏈接庫(kù)并使當(dāng)前窗口獲得焦點(diǎn)
IF Params = 0 OR Initialize
PRIVATE HWND
DECLARE INTEGER GetActiveWindow IN win32api
HWND = GetActiveWindow()
DECLARE addUNZIP_Initialise IN AUNZIP32
DECLARE SHORT addUNZIP_SetParentWindowHandle IN AUNZIP32 SHORT @ HWindow
DECLARE SHORT addUNZIP_ArchiveName IN AUNZIP32 STRING @ sArchName
DECLARE SHORT addUNZIP_RestoreStructure IN AUNZIP32 SHORT @ nResStr
DECLARE SHORT addUNZIP_Freshen IN AUNZIP32 SHORT @ nFreshn
DECLARE SHORT addUNZIP_Include IN AUNZIP32 STRING @ sFileName
DECLARE SHORT addUNZIP_ExtractTo IN AUNZIP32 STRING @ sExtrTo
DECLARE SHORT addUNZIP_Register IN AUNZIP32 STRING @ RegName, INTEGER @ RegNum
DECLARE SHORT addUNZIP_Decrypt IN AUNZIP32 STRING @ sPassw
DECLARE SHORT addUNZIP_Overwrite IN AUNZIP32 SHORT @ nOvLevel
DECLARE SHORT addUNZIP IN AUNZIP32
addUNZIP_Initialise()
addUNZIP_SetParentWindowHandle(HWND)
* addUNZIP_Register("RegistrationName", RegistrationNumber)
* 如果使用的是本動(dòng)態(tài)鏈接庫(kù)的注冊(cè)版本,則可以添加上面一行
* 其作用是在壓縮文件中使用密碼保護(hù)
* 如果沒(méi)有指定壓縮文件名,則返回0(沒(méi)有文件被解壓縮)
IF Params < 2
RETURN 0
ENDIF
ENDIF
* 如果沒(méi)有指定解壓縮目標(biāo)目錄,則響鈴并返回0(沒(méi)有文件被解壓縮)
IF Params < 3
?? CHR(7)
MESSAGEBOX('缺少解壓縮參數(shù)!',0, 'AUNZip 警告!')
RETURN 0
ENDIF
* 如果存在解壓縮參數(shù),則獲取解壓縮參數(shù)
IF Params > 3
UnZIPparams = ALLT(UnZIPparams)
PRIVATE LastPos, PASSWORD, nCurPos
LastPos = LEN(UnZIPparams) + 1
* 檢查是否使用密碼
nCurPos = ATC('S', UnZIPparams)
IF nCurPos > 0
cPassWord = SUBSTR(UnZIPparams, nCurPos+1)
addUNZIP_Decrypt(cPassWord)
UnZIPparams = LEFT(UnZIPparams, nCurPos -1)
ENDIF
* 檢查是否恢復(fù)目錄信息
nCurPos = ATC('D', UnZIPparams)
IF nCurPos > 0
addUNZIP_RestoreStructure(1)
ENDIF
* 檢查是否進(jìn)行文件更新
nCurPos = ATC('F', UnZIPparams)
IF nCurPos > 0
addUNZIP_RestoreStructure(1)
ENDIF
* 檢查是否覆蓋文件
DO CASE
* 全部覆蓋
CASE 'OA' $ UnZIPparams
addUNZIP_Overwrite(0x0b)
* 不覆蓋
CASE 'O0' $ UnZIPparams
addUNZIP_Overwrite(0x0c)
* 提問(wèn)是否覆蓋
CASE 'OU' $ UnZIPparams
addUNZIP_Overwrite(0x0a)
ENDCASE
IF nCurPos > 0
addUNZIP_RestoreStructure(1)
ENDIF
ELSE
addUNZIP_Overwrite(0x000a)
ENDIF
* 確認(rèn)需要解壓縮的壓縮文件名
addUNZIP_ArchiveName(sArchive)
* 確認(rèn)解壓縮目標(biāo)路徑
addUNZIP_ExtractTo(ALLT(sDir))
* 確認(rèn)需要進(jìn)行解壓縮的文件
sExtractFiles = IIF(Params<4, "*.*", ALLT(STRTRAN(sExtractFiles, ' ', '|')))
* 構(gòu)造解壓縮信息
addUNZIP_Include(sExtractFiles)
* 解壓縮文件并返回被解壓縮的文件數(shù)目
RETURN addUNZIP()
[補(bǔ)充說(shuō)明]
動(dòng)態(tài)鏈接庫(kù)AZIP.DLL和AUNZIP.DLL是NetCom公司英國(guó)分部的工程師Stephen Darlington編寫(xiě)的共享軟件AddZip中的一部分。該軟件包以及本文中的程序可以從本網(wǎng)站下載。