Untersuche zip Datei ohne externe library

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Untersuche zip Datei ohne externe library

Beitrag 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) 
Zuletzt geändert von Rings am 25.07.2008 14:39, insgesamt 2-mal geändert.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@Rings
Klappt wunderbar :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

da iss nat. nen dreher drinne, musste ja so sein :)
das mit no valid darf nur kommen beim ersten block
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

überhaupt : endlich mal jemand anständiges, der sich auch traut, ein GOTO einzusetzen.
:bounce:
:allright:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag 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)
Rings hat geschrieben:ziert sich nich beim zitieren
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag 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) 
Rings hat geschrieben:ziert sich nich beim zitieren
Antworten