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