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