Code archives/File Utilities/Read contents of online zip file
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This is just a brutal port (via 'Import BB') of readzip by Mike Carroll to BlitzMax, with online support hacked in. I wanted to see the contents of the latest Android SDK to see if there was anything new compared to my install, and found Mike's code in the Code Archives -- all credit for this goes to him! This example just prints the contents of the Gnet zip archive to the command line (or IDE output). | |||||
' BMX/online port of... ' readzip.bb ' by Mike Carroll, 20040418 ' www.iol.ie/~carrollm ' Need to explore the contents of a zip file? You do? Then you're in luck! With ' Unky Mike's handy Zip File reader, your Blitz Basic program need never again ' suffer from zip-file-contents-ignorance! ' ' Note: this function DOES NOT extract the contents of a zip file; it just tells ' you what's in there. ' ' The routine was written using Unky Mike's MIUAYGA principle ("Making It Up As" ' You Go Along"); it works fine on every zip file I've tried, but it's possible" ' that there are files out there for which it won't work... ' ' The accompanying functions are as follows: ' ' FileDateToStr(fd) & FileTimeToStr(ft) ' Turns the filedate and filetime values into human-readable formats. Filedates ' and filetimes are squashed into two-byte integers in the zip file (in the same ' format as DOS used to use). ' ' Pad0(i, w) ' Pads a number with leading zeroes. In this instance, the function is used only ' for displaying the extracted dates and times, but please feel free to use it ' anywhere you see fit. ' ' Del$(st$, pos, num) ' Deletes the specified number of characters from the string, starting at the ' specified position. Not used in this case, but I find it really handy so I ' decided to give it away free! ' ' Ins$(st1$, st2$, pos) ' Inserts st2$ into st1$ at the specified position. Also not used in this case, ' but it's also really handy and anyway the Del$ function absolutely refused to ' go without it. ' file$ = "http://www.blitzbasic.com/gnet/gnet_v1.zip" ReadDataZipfile file End Function OnlineSeekAhead (s:TStream, offset) For bytes = 0 Until offset ReadByte s Next End Function Function ReadDataZipfile(filename$) ' Note: there's not much done in the way of checking: the function returns 1 if the file exists, 0 if it doesn't If Lower (Left (filename, 7)) <> "http://" Then Return filename = "http::" + Right (filename, Len (filename) - 7) filein:TStream = LittleEndianStream (ReadStream (filename$)) If filein <> Null Then ' the file exists Try While (Not Eof(filein)) ' read the header signature to determine whether this is a file or a central directory record headersig = ReadInt(filein) If headersig = $04034b50 Then ' this is a file (0x04034b50) = 67324752 version = ReadByte(filein) + 256*(ReadByte(filein)) generalpurpose = ReadByte(filein) + 256*(ReadByte(filein)) compmethod = ReadByte(filein) + 256*(ReadByte(filein)) modtime = ReadByte(filein) + (256 * ReadByte(filein)) moddate = ReadByte(filein) + (256 * ReadByte(filein)) crc32 = ReadInt(filein) compsize = ReadInt(filein) uncompsize = ReadInt(filein) fnlen = ReadByte(filein) + 256*(ReadByte(filein)) extrafieldlen = ReadByte(filein) + 256*(ReadByte(filein)) fn$ = "" For i = 1 To fnlen fn = fn + Chr(ReadByte(filein)) Next ' skip file data and extra field data ' SeekStream filein, StreamPos(filein)+compsize+extrafieldlen OnlineSeekAhead filein, compsize+extrafieldlen If generalpurpose & 8 Then ' If generalpurpose bit 3 is set, then CRC, compsize and uncompsize are incorrect in the header... crc32 = ReadByte(filein)+ReadByte(filein)+ReadByte(filein)+ReadByte(filein) compsize = ReadInt(filein) uncompsize = ReadInt(filein) EndIf count = count + 1 Print count+" "+fn$+" "+uncompsize+" "+compsize+" "+FileDateToStr(moddate)+" "+FileTimeToStr(modtime) EndIf If headersig = $02014b50 Then' this is a central directory record (0x02014b50) = 33639248 versionmadeby = ReadByte(filein) + 256*(ReadByte(filein)) version = ReadByte(filein) + 256*(ReadByte(filein)) generalpurpose = ReadByte(filein) + 256*(ReadByte(filein)) compmethod = ReadByte(filein) + 256*(ReadByte(filein)) modtime = ReadByte(filein) + (256 * ReadByte(filein)) moddate = ReadByte(filein) + (256 * ReadByte(filein)) crc32 = ReadInt(filein) compsize = ReadInt(filein) uncompsize = ReadInt(filein) fnlen = ReadByte(filein) + 256*(ReadByte(filein)) extrafieldlen = ReadByte(filein) + 256*(ReadByte(filein)) commentlen = ReadByte(filein) + 256*(ReadByte(filein)) disknumberstart = ReadByte(filein) + 256*(ReadByte(filein)) internalfileattributes = ReadByte(filein) + 256*(ReadByte(filein)) externalfileattributes = ReadInt(filein) relativeoffsetoflocalheader = ReadInt(filein) ' skip file data and extra field data 'SeekStream filein, StreamPos(filein)+compsize+extrafieldlen OnlineSeekAhead filein, compsize+extrafieldlen endofcentraldirsignature = ReadInt(filein) ' (0x06054b50) = 101010256 numberofthisdisk = ReadByte(filein) + 256*(ReadByte(filein)) numberofdiskwithstart = ReadByte(filein) + 256*(ReadByte(filein)) totalentriesincentraldirondisk = ReadByte(filein) + 256*(ReadByte(filein)) totalentriesincentraldir = ReadByte(filein) + 256*(ReadByte(filein)) sizeofthecentraldir = ReadInt(filein) offsetofcentraldir = ReadInt(filein) commentlen = ReadByte(filein) + 256*(ReadByte(filein)) comment$ = "" For i = 1 To commentlen comment = comment + Chr(ReadByte(filein)) Next EndIf Wend Catch ReadFail:Object DebugLog "Read error in " + filename End Try CloseFile(filein) Return 1 Else ' the file doesn't exist, so return 0 Return 0 EndIf End Function' ReadZipfile Function FileDateToStr$(fd) ' filedate = ((year - 1980) * 512) + (month * 32) + day ' Returns "yyyy/mm/dd" Local year, month, day year = (fd / 512)+1980 month = (fd Mod 512) / 32 day = (fd Mod 32) Return year+"/"+ Pad0(month, 2) + "/"+ Pad0(day, 2) End Function' FileDateToStr Function FileTimeToStr$(ft) ' filetime = (hour * 2048) + (min * 32) + (sec / 2) ' Returns "hh:mm:ss" Local hour, fmin, sec hour = (ft / 2048) fmin = (ft Mod 2048) / 32 sec = (ft Mod 32) * 2 Return Pad0(hour, 2)+":"+Pad0(fmin, 2)+":"+Pad0(sec, 2) End Function' FileTimeToStr Function Pad0$(i, w) ' Uses leading zeros to pad a number to the required length Local tst$ tst$ = i While Len(tst) < w tst = "0"+tst Wend Return tst End Function' Pad0 Function Del$(st$, pos, num) ' Deletes 'num' characters from the string, starting at the position specified by 'pos' Local tst$ tst$ = Left$(st, pos-1) tst2$ = Right$(st, Len(st)-(pos+num-1)) Return tst$ + tst2$ End Function Function Ins$(st1$, st2$, pos) ' Inserts st2 into st1 at the position specified by 'pos' Local tst$ tst$ = Left$(st1, pos-1) tst2$ = Right$(st1, Len(st1)-(pos-1)) Return tst+st2+tst2 End Function |
Comments
None.
Code Archives Forum