Seite 1 von 1
Untersuche zip Datei ohne externe library
Verfasst: 25.07.2008 11:23
von Rings
Code: Alles auswählen
Structure typZipLocalFileHead ; 30 bytes
zlfhSignature.l; As Long ' 0x04034B50
zlfhVersion.w; As Integer
zlfhBitFlag.w; As Integer
zlfhCompression.w; As Integer
zlfhModFileTime.w; As Integer
zlfhModFileData.w; As Integer
zlfhCRC.l; As Long
zlfhCompressedSize.l; As Long
zlfhUncompressedSize.l; As Long
zlfhFileNameLength.w; As Integer
zlfhExtraFieldLength.w; As Integer
EndStructure
Procedure ListZipFile(Filename.s)
ReadHead.typZipLocalFileHead
FF=ReadFile(#PB_Any,Filename)
If FF
again:
ReadHead\zlfhSignature= ReadLong(ff)
If ReadHead\zlfhSignature=$4034B50
;Debug "valid Zip File!"
FileSeek(FF,Loc(ff)-4)
;Debug Loc(FF)
Laenge = ReadData(FF, @ReadHead, SizeOf(ReadHead))
;Debug Loc(FF)
With ReadHead
; Get the file name
If \zlfhFileNameLength<>0
FileString.s = Space(\zlfhFileNameLength)
;Debug Loc(FF)
Laenge = ReadData(FF, @FileString, \zlfhFileNameLength)
;Debug Loc(FF)
Debug Filestring
EndIf
Debug" Compressed=" + Str(\zlfhCompressedSize) + " UnCompressed=" + Str(\zlfhUnCompressedSize)
;Debug \zlfhExtraFieldLength
;Debug \zlfhBitFlag
; Work out how much extra Data To skip over
SeekSize = \zlfhCompressedSize
If \zlfhExtraFieldLength
SeekSize + \zlfhExtraFieldLength
EndIf
If (\zlfhBitFlag & $4)
SeekSize + 12
EndIf
;Debug Seeksize
EndWith
;Seek To Next record
Seeksize + Loc(FF)
;Debug Seeksize
FileSeek(FF,Seeksize)
; Increment file count
Filecount + 1
Goto again
Else
Debug "no more entries in ZIP"
EndIf
Debug Str(Filecount) + " in ZipFile"
CloseFile(FF)
EndIf
EndProcedure
FileName.s= "c:\B0712021_Botek_Werk3_HMI.zip"
ListZipFile(FileName)
Verfasst: 25.07.2008 12:05
von RSBasic
@Rings
Klappt wunderbar

Verfasst: 25.07.2008 14:17
von bobobo
kann ich nachvollziehen
hab kein c:\B0712021_Botek_Werk3_HMI.zip
wo is der Unterschied zwischen validen und invaliden zips.
Mit filzip gezippte erscheinen als 'no valid zip'
obwohl die natürlich funktionieren.
Verfasst: 25.07.2008 14:26
von Rings
da iss nat. nen dreher drinne, musste ja so sein

das mit no valid darf nur kommen beim ersten block
Verfasst: 25.07.2008 14:39
von bobobo
überhaupt : endlich mal jemand anständiges, der sich auch traut, ein GOTO einzusetzen.

Verfasst: 25.07.2008 14:41
von Rings
bobobo hat geschrieben:überhaupt : endlich mal jemand anständiges, der sich auch traut, ein GOTO einzusetzen.

oldskool - quick&dirty coding halt
(in wirklichkeit war ich zufaul für ne loop im handbuch nachzuschauen)
Verfasst: 25.07.2008 16:30
von THEEX
Noch kein Gotoflame hier? *grinst*
Ich würd einfach mal sagen, es kommt immer auf die Situation und bei kleineren Projekten seh ich in der Regel keinen Grund, nicht doch Goto einzusetzen.
Verfasst: 25.07.2008 16:47
von Rings
irgendeiner muss es ja ohne goto machen:
Code: Alles auswählen
Structure typZipLocalFileHead ; 30 bytes
zlfhSignature.l; As Long ' 0x04034B50
zlfhVersion.w; As Integer
zlfhBitFlag.w; As Integer
zlfhCompression.w; As Integer
zlfhModFileTime.w; As Integer
zlfhModFileData.w; As Integer
zlfhCRC.l; As Long
zlfhCompressedSize.l; As Long
zlfhUncompressedSize.l; As Long
zlfhFileNameLength.w; As Integer
zlfhExtraFieldLength.w; As Integer
EndStructure
Procedure ListZipFile(Filename.s)
ReadHead.typZipLocalFileHead
FF=ReadFile(#PB_Any,Filename)
If FF
Repeat
ReadHead\zlfhSignature= ReadLong(ff)
If ReadHead\zlfhSignature=$4034B50
;Debug "valid Zip File!"
FileSeek(FF,Loc(ff)-4)
;Debug Loc(FF)
Laenge = ReadData(FF, @ReadHead, SizeOf(ReadHead))
;Debug Loc(FF)
With ReadHead
; Get the file name
If \zlfhFileNameLength<>0
FileString.s = Space(\zlfhFileNameLength)
;Debug Loc(FF)
Laenge = ReadData(FF, @FileString, \zlfhFileNameLength)
;Debug Loc(FF)
Debug Filestring
EndIf
Debug" Compressed=" + Str(\zlfhCompressedSize) + " UnCompressed=" + Str(\zlfhUnCompressedSize)
;Debug \zlfhExtraFieldLength
;Debug \zlfhBitFlag
; Work out how much extra Data To skip over
SeekSize = \zlfhCompressedSize
If \zlfhExtraFieldLength
SeekSize + \zlfhExtraFieldLength
EndIf
If (\zlfhBitFlag & $4)
SeekSize + 12
EndIf
;Debug Seeksize
EndWith
;Seek To Next record
Seeksize + Loc(FF)
;Debug Seeksize
FileSeek(FF,Seeksize)
; Increment file count
Filecount + 1
Else
If fileCount = 0
Debug "no valid ZIP"
EndIf
quitLoop = 1
EndIf
Until quitLoop
Debug Str(Filecount) + " in ZipFile"
CloseFile(FF)
EndIf
EndProcedure
FileName.s= "c:\meinezipdateizumtesten.zip"
ListZipFile(FileName)