在一些批處理任務(wù)的應(yīng)用程序如安裝程序中,需要對壓縮文件進(jìn)行解壓縮處理。VB來實(shí)現(xiàn)對壓縮文件格式,如RAR、Zip等文件的解壓縮,總的來說,有以下兩種方法:
一、 采用winrar命令行
一般來說,安裝好winrar后,在安裝目錄中,有個(gè)名為rar.txt的文件。其實(shí)該文件就是Winrar的控制臺(命令行)中文手冊。下面我們一起來學(xué)習(xí)一下,和解壓縮文件有關(guān)的命令行。
Winrar命令行的通用格式是:
RAR <命令> [ -<開關(guān)> ] <壓縮文件> [ <@列表文件...> ]
[ <文件...> ] [ <解壓路徑\> ]
舉例來說 ,<命令>為a時(shí) ,表示添加文件到壓縮文件中,其中需壓縮的文件由列表文件指定。當(dāng)<命令>為e的時(shí)候,就表示解壓文件到當(dāng)前目錄。如果需要將壓縮文件解壓縮到自定義目錄,則通常使用x命令,該命令表示帶絕對路徑進(jìn)行解壓縮。 -<開關(guān)>為-y,表示對于所有詢問全部回答是。如果rar文件包含密碼,則需要添加開關(guān)為"-p密碼字符串",否則不能正常解壓縮。
如果要判斷是否winrar命令行是否執(zhí)行成功,可以通過該命令行的返回值來判斷。如果返回值為0,則成功執(zhí)行。如果不為0,則執(zhí)行過程中出現(xiàn)錯(cuò)誤。錯(cuò)誤代碼rar.txt中有詳細(xì)定義。請仔細(xì)研讀該文件。
在有了上述理論作為基礎(chǔ)之后,接下來,我們用VB來實(shí)現(xiàn)創(chuàng)建和解壓縮一個(gè)帶密碼的壓縮文件。
打開VB6,新建一個(gè)標(biāo)準(zhǔn)的Exe工程文件,界面設(shè)計(jì)如下圖所示,控件的名稱采用默認(rèn)的名稱。
圖 解壓縮界面
程序首先要獲得Winrar的安裝路徑,一般來說,安裝好了Winrar后,會(huì)在注冊表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\創(chuàng)建一個(gè)winrar.exe的路徑,該路徑下有一個(gè)名為Path的字符串項(xiàng),該項(xiàng)的值保存的就是Winrar的安裝路徑。本例中,引用Registry Access Functions對象來實(shí)現(xiàn)對注冊表的操作。
Private Function GetWINRARPath() As String '獲得Winrar安裝路徑
……
KeyFound = myReg.GetKeyValue(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\App Paths\winrar.EXE", "Path", GetWINRARPath)
……
GetWINRARPath = GetWINRARPath & "\WINRAR.exe"
End Function
'壓縮文件
Private Sub Compress(ByVal TARGET As String, ByVal FilelistPath As String, ByVal Password As String)
……
Shell GetWINRARPath & " a -p" & Password & " " & TARGET & " @" & FilelistPath, vbHide
……
End Sub
'解壓縮文件
Private Sub DeCompress(ByVal TARGET As String, ByVal Source As String, ByVal Password As String)
……
Shell GetWINRARPath & " x -y -p" & Password & " " & TARGET & " " & Source, vbHide
……
End Sub
其他代碼由于篇幅的關(guān)系,不在這里列出來。請到筆者個(gè)人主頁http://www.5ibiancheng.com原創(chuàng)作品欄目中下載源代碼。
二、 采用Unrar.dll(或者Unrar.ocx控件)進(jìn)行解壓縮
將Unrar.dll控件復(fù)制到工程目錄或者Windows\System32下,并在工程目錄下,新建一個(gè)批處理文件,輸入regsvr32.exe /s UnRar.dll指令后存盤。運(yùn)行該批處理指令,對其進(jìn)行注冊。注意為了保證程序的正常運(yùn)行,需要要獲得最新版本的UnRar.dll文件。讀者可以去RAR實(shí)驗(yàn)室下載,地址是:http://www.rarlab.com/rar_add.htm。
下面介紹一下Unrar.dll在VB中的使用方法。
新建一個(gè)標(biāo)準(zhǔn)exe文件工程,將Unrar.ocx控件添加到工程中,界面和上一個(gè)例子相同。
添加以下API函數(shù)聲明到窗體的通用聲明部分:
Public Declare Function RAROpenArchive Lib "unrar.dll" (ByRef ArchiveData As RAROpenArchiveData) As Long
類似地,同時(shí)需要聲明的還有:RARCloseArchive、RARReadHeader、RARProcessFile、RARSetChangeVolProc和RARSetPassword函數(shù)。可以說,程序解壓縮的核心技術(shù)就是這幾個(gè)函數(shù)實(shí)現(xiàn)的。
使用Unrar.dll進(jìn)行解壓縮的流程和核心代碼如下:
''打開壓縮文件(OpenArchive)主要利用RAROpenArchive函數(shù)實(shí)現(xiàn),該函數(shù)返回rar文件數(shù)據(jù)的句柄。
LHANDLE = RAROpenArchive(uRAR)
'如果有rar文件有密碼,則需執(zhí)行以下代碼:
If PassWord <> "" Then RARSetPassword LHANDLE, PassWord
'接下來讀取rar文件頭,將返回值存放到變量p_Status中.
p_Status= RARReadHeader(LHANDLE, uHeader)
'解壓縮文件到指定的路徑,注意當(dāng)?shù)谌齻€(gè)參數(shù)指定解壓路徑的時(shí)候,第四個(gè)參數(shù)必須為為空字符串,否則,測試不通過
Ret = RARProcessFile(LHANDLE, RAR_EXTRACT, destpath, "")
'繼續(xù)讀取rar文件,將返回值存放到變量p_Status中.
p_Status= RARReadHeader(LHANDLE, uHeader)
返回上一步,繼續(xù)解壓縮文件,并判斷p_Status是否為非0的值,當(dāng)解壓縮完成時(shí)候,,p_Status為非0,則退出循環(huán)。
分析以上的代碼,在VB中實(shí)現(xiàn)對RAR文件的解壓縮控制其實(shí)并不太難,尤其值得說明的是,第二種方法,可以將其應(yīng)用在.net框架下,實(shí)現(xiàn)本地操作服務(wù)器在線解壓縮文件的功能。讀者可以嘗試一下。
聯(lián)系客服