I needed a program that unzip a zip file and preserves its directory structure using only Purebasic. I couldn't find one, so I made one

I tested it against 7zip and the zip extractor built in Windows Explorer. It extracts exactly the same (verified with the SHA-256 hash of the whole extracted directory using 7zip).
Please comment

Code: Select all
UseZipPacker()
; If CreatePack(0, "monarchive.zip")
; AddPackFile(0, "monfich.txt", "mondoss/monfich.txt")
; AddPackFile(0, "monfich.txt", "monfich.txt")
; ClosePack(0)
; Else
; Debug "Error creating pack monarchive.zip"
; EndIf
; st = ElapsedMilliseconds()
If OpenPack(1, "secretarchive.zip")
If ExaminePack(1)
CreateDirectory("secretarchive")
SetCurrentDirectory("secretarchive")
BaseDir$ = GetCurrentDirectory()
While NextPackEntry(1)
Debug "Name : " + PackEntryName(1) + " | Type : " + PackEntryType(1) + " | Size : " + PackEntrySize(1)
nbstr = CountString(PackEntryName(1), "/")
If nbstr >= 1
Debug "nbstr = " + nbstr
For i = 1 To nbstr ; création des dossiers (nombre de "/" == nombre de dossiers à créer)
dir$ = StringField(PackEntryName(1), i, "/")
resultCreateDir = CreateDirectory(dir$)
Debug "resultCreateDir "+dir$+" = " + resultCreateDir
SetCurrentDirectory(GetCurrentDirectory() + dir$)
Next
If Right(PackEntryName(1), 1) <> "/" And PackEntryType(1) = #PB_Packer_Directory ; cas où le dernier élément ne termine PAS par "/" mais est un dossier quand même
dir$ = StringField(PackEntryName(1), nbstr+1, "/")
resultCreateDir = CreateDirectory(dir$)
Debug "resultCreateDir LASTDIR "+dir$+" = " + resultCreateDir
Else
filename$ = StringField(PackEntryName(1), nbstr+1, "/") ; vérification que le dernier élément est bien un nom de fichier
If filename$ <> "" ; exemple : si on demande le dernier champ et qu'il est vide alors on un problème
UncompressPackFile(1, filename$)
Else
Debug "PackEntryName invalid : filename$ vide"
EndIf
EndIf
SetCurrentDirectory(BaseDir$)
ElseIf nb = 0
If PackEntryType(1) = #PB_Packer_Directory
resultCreateDir = CreateDirectory(PackEntryName(1))
Debug "resultCreateDir NOSLASH "+PackEntryName(1)+" = " + resultCreateDir
Else
UncompressPackFile(1, PackEntryName(1))
EndIf
Else
Debug "INVALID PackName nbstr = " + nbstr
EndIf
Wend
Else
Debug "Can't examine pack"
EndIf
Else
Debug "Can't open monarchive.zip"
EndIf
; et = ElapsedMilliseconds()
;
; Define out.s = Str(et-st) + "ms"
; SetClipboardText(out)
; IDE Options = PureBasic 6.20 (Windows - x64)
; CursorPosition = 65
; FirstLine = 17
; EnableXP
; DPIAware
; Executable = ziptest.exe
; CompileSourceDirectory