List The Content of Files Compressed with WinZip/ARJ
List The Content of Files Compressed with WinZip/ARJ
Author: Martin Carlsson
The code below can tell you, for example, that the file myZipFile.zip
contains the files file1.gif, file2.exe, etc.
Preparations
Add 1 List Box to your form.
Module Code
Private Type ZFHeader
Signature As Long
version As Integer
GPBFlag As Integer
Compress As Integer
Date As Integer
Time As Integer
CRC32 As Long
CSize As Long
USize As Long
FNameLen As Integer
ExtraField As Integer
End Type
Private Type ARJmainheader
id As Integer
headersize As Integer
firsthdrsize As Byte
version As Byte
minversion As Byte
archiveos As Byte
flags As Byte
secversion As Byte
filetype As Byte
x_reserved As Byte
createtime As Long
modifytime As Long
FileSize As Long
secenvpos As Long
filespecpos As Integer
secenvlength As Integer
x_notused As Integer
End Type
Private Type ARJlocalheader
id As Integer
headersize As Integer
firsthdrsize As Byte
version As Byte
minversion As Byte
archiveos As Byte
flags As Byte
method As Byte
filetype As Byte
x_reserved As Byte
datemodify As Long
sizecompr As Long
sizeorig As Long
origcrc As Long
filespecpos As Integer
accessmode As Integer
hostdata As Integer
End Type
Private Type LZHheader
headersize As Byte
remaincrc As Byte
id As String * 3
method As String * 1
id2 As String * 1
sizecompr As Long
sizeorig As Long
filedate As Long
fileattrib As Integer
filenamelen As Byte
End Type
Private Function StripGarbage(ByVal str As String) As String
Dim sTmp As String, ch As String * 1, i As Integer
For i = 1 To Len(str)
ch = Mid$(str, i, 1)
If ch <> Chr$(0) Then
sTmp = sTmp & ch
Else
StripGarbage = sTmp
Exit Function
End If
Next
End Function
Public Sub AddLZHfiles(LZHfile As String, LBox As ListBox)
Dim FNum As Integer, LZHrec As LZHheader, NameStr As String
FNum = FreeFile
Open LZHfile For Binary Lock Write As #FNum
Do
If (Loc(FNum) + Len(LZHrec)) > LOF(FNum) Then Exit Do
Get FNum, , LZHrec
If Left$(LZHrec.id, 2) = "-l" Then
NameStr = Space$(LZHrec.filenamelen)
Get FNum, , NameStr
LBox.AddItem Trim$(NameStr) & Chr$(9) & Chr$(9) & LZHrec.sizeorig
Seek FNum, Loc(FNum) + 2 + LZHrec.sizecompr + 4
End If
Loop Until EOF(FNum)
Close FNum
End Sub
Public Sub AddARJfiles(ARJfile As String, LBox As ListBox)
Dim FNum As Integer, ARJrec As ARJmainheader, FILrec As
ARJlocalheader, FPos As Long
Dim NameStr As String * 256
FNum = FreeFile
Open ARJfile For Binary Lock Write As #FNum
Get FNum, , ARJrec
If ARJrec.id = -5536 Then
Seek FNum, ARJrec.headersize + 11
Do
If (Loc(FNum) + Len(FILrec)) > LOF(FNum) Then Exit Do
FPos = Loc(FNum)
Get FNum, , FILrec
If FILrec.id = -5536 Then
Get FNum, , NameStr
NameStr = StripGarbage(NameStr)
LBox.AddItem Trim$(NameStr) & Chr$(9) & Chr$(9) &
FILrec.sizeorig
Seek FNum, FPos
Seek FNum, Loc(FNum) + FILrec.headersize + 12 +
FILrec.sizecompr
End If
Loop Until EOF(FNum)
End If
Close FNum
End Sub
Public Sub AddZIPfiles(ByVal ZIPfile As String, LBox As ListBox)
Dim FNum As Integer, sRet As String
Dim iCounter As Integer, sResult As String
Dim zhdr As ZFHeader
Const ZIPSIG = &H4034B50
FNum = FreeFile
Open ZIPfile For Binary Lock Read Write As #FNum
Get #FNum, , zhdr
While zhdr.Signature = ZIPSIG
ReDim s(0 To zhdr.FNameLen - 1) As String * 1
For iCounter = 0 To UBound(s)
s(iCounter) = Chr$(0)
Next
For iCounter = 0 To zhdr.FNameLen - 1
Get #FNum, , s(iCounter)
Next
Seek #FNum, Seek(FNum) + zhdr.CSize + zhdr.ExtraField
sResult = ""
For iCounter = 0 To UBound(s)
sResult = sResult & s(iCounter)
Next
LBox.AddItem sResult & Chr$(9) & Format$(zhdr.USize)
Get #FNum, , zhdr
Wend
Close FNum
End Sub
Form Code
Private Sub Form_Load()
'replace "C:\myZipFile.zip" with the Zip file you want to see its content
AddZIPfiles "C:\myZipFile.zip", List1
End Sub
|