LZ形式で圧縮されたファイルの解凍 <TOP>
あまり見かけなくなりましたが、COMPRESS.EXEで圧縮されたファイル(拡張子の後尾に 「 _ 」 が付く)を解凍します。
LZOpenFile 解凍するファイルと、解凍後のファイルのハンドルを取得
LZCopy 元ファイルを、解凍後ファイルにコピー
LZClose ファイルを閉じる
PathRemoveExtension パス文字列から拡張子を取り除く
例では、あらかじめC:\TEST\LZに用意した圧縮ファイルPWDESKTO.HL_を選択し、解凍後の拡張子をHLPと設定しています。
解凍されたファイルの存在確認(PWDESKTP.hlp)とそのファイルを開いたところ
'================================================================ '= LZ形式で圧縮されたファイルの解凍
'= (LZOpenFile.bas) '================================================================ #include "Windows.bi" Type OFSTRUCT cBytes As byte fFixedDisk As byte nErrCode As Integer Reserved1 As Integer Reserved2 As Integer szPathName As String * 128 End Type ' 解凍するファイルと、解凍後のファイルのハンドルを取得 Declare Function Api_LZOpenFile& Lib "lz32" Alias "LZOpenFileA" (ByVal lpszFile$, lpOf As OFSTRUCT, ByVal style&) ' 元ファイルを、解凍後ファイルにコピー Declare Function Api_LZCopy& Lib "lz32" Alias "LZCopy" (ByVal hfSource&, ByVal hfDest&) ' ファイルを閉じる Declare Sub Api_LZClose Lib "lz32" Alias "LZClose" (ByVal hfFile&) ' パス文字列から拡張子を取り除く関数 Declare Sub Api_PathRemoveExtension Lib "shlwapi" Alias "PathRemoveExtensionA" (ByVal pszPath$) #define OF_READ &H0 'ファイルを読みとり専用で開く #define OF_CREATE &H1000 '新しいファイルを作成する #define LZERROR_BADINHANDLE (-1) 'コピー元ファイルのハンドルが無効 #define LZERROR_BADOUTHANDLE (-2) 'コピー先ファイルのハンドルが無効 #define LZERROR_BADVALUE (-7) '入力パラメータの 1 つが無効 #define LZERROR_GLOBLOCK (-6) 'LZファイルハンドルをロックできない #define LZERROR_PUBLICLOC (-5) ' #define LZERROR_READ (-3) 'コピー元ファイルの形式が無効 #define LZERROR_UNKNOWNALG (-8) 'コピー元ファイルは認識できない形式で圧縮されている #define LZERROR_WRITE (-4) 'コピー先ディスクの容量が足りない Var Shared Text(1) As Object Var Shared Edit1 As Object For i = 0 To 1 Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) Text(i).SetFontSize 14 Next Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 Var Shared FileName As String '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() FileName = WinOpenDlg("ファイルのオープン", "*.*", "全てのファイル(*.*)", 0) If FileName <> Chr$(&H1B) Then Text(0).SetWindowText FileName dName$ = FileName Api_PathRemoveExtension dName$ Edit1.SetWindowText dName$ Edit1.SetSelText Len(dName$), Len(dName$) Edit1.SetFocus End If End Sub '================================================================ '= '================================================================ Declare Sub Button2_on edecl () Sub Button2_on() Var SourceStruct As OFSTRUCT Var DestStruct As OFSTRUCT Var hSource As Long Var hDest As Long Var Ret As Long 'ソースと新しいファイルを開く hSource = Api_LZOpenFile(FileName, SourceStruct, OF_READ) hDest = Api_LZOpenFile(Edit1.GetWindowText, DestStruct, OF_CREATE) 'ファイルをコピーする Ret = Api_LZCopy(hSource, hDest) 'ファイルを閉じる Api_LZClose hSource Api_LZClose hDest 'エラーチェックと成功 Select Case Ret Case LZERROR_BADINHANDLE Text(1).SetWindowText "LZERROR_BADINHANDLE" Case LZERROR_BADOUTHANDLE Text(1).SetWindowText "LZERROR_BADOUTHANDLE" Case LZERROR_BADVALUE Text(1).SetWindowText "LZERROR_BADVALUE" Case LZERROR_GLOBLOCK Text(1).SetWindowText "LZERROR_GLOBLOCK" Case LZERROR_PUBLICLOC Text(1).SetWindowText "LZERROR_PUBLICLOC" Case LZERROR_READ Text(1).SetWindowText "LZERROR_READ" Case LZERROR_UNKNOWNALG Text(1).SetWindowText "LZERROR_UNKNOWNALG" Case LZERROR_WRITE Text(1).SetWindowText "LZERROR_WRITE" Case Else Text(1).SetWindowText "Success !" End Select End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End