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 :allright:

Verfasst: 25.07.2008 14:17
von bobobo
kann ich nachvollziehen

hab kein c:\B0712021_Botek_Werk3_HMI.zip

:D

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.
:bounce:
:allright:

Verfasst: 25.07.2008 14:41
von Rings
bobobo hat geschrieben:überhaupt : endlich mal jemand anständiges, der sich auch traut, ein GOTO einzusetzen.
:bounce:
:allright:
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)