eXept Software AG Logo

Smalltalk/X Webserver

Documentation of class 'ZipArchive':

Home

everywhere
www.exept.de
for:
[back]

Class: ZipArchive


Inheritance:

   Object
   |
   +--ZipArchive

Package:
stx:libbasic2
Category:
System-Support-FileFormats
Version:
rev: 1.82 date: 2010/02/02 11:11:36
user: cg
file: ZipArchive.st directory: libbasic2
module: stx stc-classLibrary: libbasic2
Author:
Claus Gittinger

Description:


provides access to a zip archive.
Caveat: the only compression method (for now) is deflate.


Class protocol:

Signal constants
o  unsupportedZipFileFormatErrorSignal

o  zipFileFormatErrorSignal

class initialization
o  initialize

cleanup
o  flush
forget about cached zipArchives

o  installFlushBlock
forget about cached zipArchives

o  lowSpaceCleanup
forget about cached zipArchives

constants
o  COMPR_DEFLATED
please use compressionDeflated instead (Squeak compat.)

o  COMPR_STORED
please use compressionStored instead (Squeak compat.)

o  LREC_SIZE

o  centralDirectoryMinimumSize

o  compressionDeflated
same as COMPR_DEFLATED - squeak compatibility

o  compressionStored
same as COMPR_STORED - squeak compatibility

o  streamBufferSize

debugging
o  debugTrace: aBoolean

instance creation
o  newFileNamed: name

o  oldFileNamed: name

o  oldFileNamed: name startOfArchive: startOfArchive endOfArchive: endOfArchive

o  readingFrom: aPositionableStream
open an existing Zip archive - read data from aPositionableStream

o  writingTo: aPositionableStream
open an new Zip archive - write data to aPositionableStream

queries
o  isZipArchive: aFilename
answer true, if aFilename references a Zip archive


Instance protocol:

accessing
o  entries
return a collection of fileName entries

o  fileSize

o  members
return a collection of members

o  membersMatching: aFileMatchPattern
return a collection of members which match aFileMatchPattern

o  name
return the (file-)name of this zipArchive

o  pathName
FileStream compatibility: answer the name of the underlying file - a String

o  setArchiveStartPosition: aStartposition endPosition: anEndPosition

o  size

finalization
o  finalizationLobby
answer the registry used for finalization.

o  finalize
some Stream has been collected - close the file if not already done

open/close
o  close

o  name: archiveFileName mode: readOrWriteMode
open read or writestream on archiveFileName

o  readFrom: aPositionableStream
initialize the archive to read from aPositionableStream

o  readingFrom: aPositionableStream
initialize the archive to read from aPositionableStream

o  writingTo: aPositionableStream
initialize the archive to read from aPositionableStream

private
o  checkZipArchive: archiveFileName

o  closeFile
close the stream - tell operating system

o  openFile

o  setDefaultArchiveBounds
set start and end of archive if it is nil. That means no bounds have been defined
before. In that case the archive is the complete file.

o  validZipFileNameFrom: zipFileName

private-decompression
o  decode: rawBytes method: compressionMethod size: uncompressedSize

o  inflate: inBytes to: outBytes

private-directory stuff
o  addCentralZipDirectory

o  addMember
add a zipMember

o  addMember: zmemb
add a zipMember

o  checkZipArchive
read the zip directory into a linked-list of zipMembers

o  findMember: name
find a zipMember by name

o  readDirectory
read the zip directory into a linked-list of zipMembers

o  searchForEndOfCentralDirectorySignature
read the zip directory into a linked-list of zipMembers

o  zipMembersDo: aBlock
evaluate aBlock for all zipMembers

reading
o  extract: fileName
extract an entry identified by fileName as a byteArray;
nil on errors

o  extract: fileName intoStream: aWriteStream
extract an entry indentified by filename into aWriteStream
return false on error

o  restoreOsDirectory: osDirectoryName fromArchiveDirectory: archiveDirectoryName

reading - stream
o  readStreamFor: nameOfFileInArchive
open a stream on archive contents identified by nameOfFileInArchive

testing
o  isValidPath: anArchivePathName

writing
o  addArchiveDirectory: archiveDirectoryName fromOsDirectory: osDirectoryName

o  addArchiveDirectory: archiveDirectoryName fromOsDirectory: osDirectoryName compressMethod: theCompressMethod

o  addArchiveDirectoryCompressed: archiveDirectoryName fromOsDirectory: osDirectoryName

o  addDirectory: aDirectoryName
do not create directories (isDirectory = true) - they are not compatible between operating systems

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  addFile: aFileName fromStream: aStream

o  addFile: aFileName fromStream: aStream compressMethod: theCompressMethodArg

o  addFile: aFileName fromStream: aStream compressMethod: theCompressMethodArg asDirectory: isDirectory
do not create directories (isDirectory = true) - they are not compatible between operating systems

o  addFile: aFileName withContents: data

o  addFile: aFileName withContents: data compressMethod: theCompressMethodArg asDirectory: isDirectory
do not create directories (isDirectory = true) - they are not compatible between operating systems

o  addFileCompressed: aFileName fromStream: aStream

o  addFileCompressed: aFileName withContents: data

o  addString: aString as: path

writing - stream
o  compressedWriteStreamFor: nameOfFileInArchive
create new entry in central directory

o  writeStreamFor: nameOfFileInArchive compressMethod: theCompressMethodArg
create new entry in central directory


Private classes:

    AbstractZipStream
    ZipCentralDirectory
    ZipMember
    ZipReadStream
    ZipWriteStream

Examples:



    |zip bytes|

    zip := ZipArchive oldFileNamed:'foo.zip'.
    bytes := zip extract:'bar'.
    zip closeFile.


    |zip bytes|

    zip := ZipArchive oldFileNamed:'source/stx/libbasic2.zip'.
    zip entries do:[:entry |
        Transcript showCR:entry
    ].
    zip closeFile.


    |zip bytes|

    zip := ZipArchive oldFileNamed:'source/stx/libbasic2.zip'.
    bytes := zip extract:'TwoByteStr.st'.
    zip closeFile.
    Transcript showCR:(bytes asString).
compatibility write check with winzip (compressed with deflate)


    |zipwr testDirectory testFileWr|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileWr := 'crcTest_resume_compressed.zip'.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
    zipwr addFile:'crcTest_resume_compressed.txt' withContents: 'resume'.
    zipwr closeFile.
compatibility read check with winzip (compressed with deflate)


    |ziprd testDirectory testFileRd contents|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileRd := 'crcTest_resume_compressed.zip'.

    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    contents := ziprd extract: ziprd entries first.
    contents inspect.
    ziprd closeFile.
compatibility write check with winzip (uncompressed)


    |zipwr testDirectory testFileWr|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileWr := 'crcTest_resume_uncompressed.zip'.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).

    zipwr addFile:'crcTest_resume_uncompressed.txt' 
        withContents:'resume' 
       compressMethod:0 
          asDirectory:false.

    zipwr closeFile.
compatibility read check with winzip (uncompressed)


    |ziprd testDirectory testFileRd contents|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileRd := 'crcTest_resume_uncompressed.zip'.

    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    contents := ziprd extract: ziprd entries first.
    contents inspect.
    ziprd closeFile.
read an archive with files and/or directories, fetch the entries and create a new archive with the same content


    |ziprd zipwr entryDict testDirectory testFileRd testFileWr|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileRd := 'projects.zip'.
    testFileWr := 'projects_expecco_test.zip'.

    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    entryDict := Dictionary new.
    ziprd entries do: [:aFileName|
        entryDict at:aFileName put:(ziprd extract: aFileName) asString.
    ].
    ziprd closeFile.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
    entryDict keysAndValuesDo: [:key :value|
        (value size == 0) ifTrue: [
            zipwr addDirectory:key.
        ] ifFalse: [
            zipwr addFile:key withContents:value
        ].
    ].
    zipwr closeFile.


    |zipwr ziprd testDirectory testFileWr testFileRd zs|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileWr := 'crcTest_resume_compressed.zip'.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
    zipwr addFile:'crcTest_resume_compressed.txt' withContents: 'Das ist ein test, das ist ein test, das ist ein test'.
    zipwr close.

    testFileRd := 'crcTest_resume_compressed.zip'.

    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    zs := ziprd readStreamFor: 'crcTest_resume_compressed.txt'.
    zs inspect.
    ziprd close.


    |zipwr ziprd testDirectory testFileWr testFileRd rs result|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileWr := 'readStreamTest_HelloWorld.zip'.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
    zipwr addFile:'readStreamTest_HelloWorld.txt' withContents: 'Hello World!' compressed: false.
    zipwr close.

    testFileRd := 'readStreamTest_HelloWorld.zip'.
    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    rs := ziprd readStreamFor: 'readStreamTest_HelloWorld.txt'.

    result := ''.
    [ rs atEnd ] whileFalse: [
        result := result, (rs nextAvailable:5).
    ].
    result inspect.
    rs close.
    ziprd close.
read an archive with files and/or directories and/or zipArchives, fetch the entries (also from the include zip archives) and create a new archive


    |ziprd zipwr entryDict testDirectory testFileRd testFileWr zipRdSub1 zipRdSub2|

    testDirectory := 'C:\Dokumente und Einstellungen\stefan\Eigene Dateien\tmp\'.
    testFileRd := 'ZipInZipFileTest.zip'.
    testFileWr := 'ZipInZipFileTest_generated.zip'.

    ziprd := ZipArchive oldFileNamed:(testDirectory, testFileRd).
    entryDict := Dictionary new.
    ziprd entries do: [:aFileName|
        Transcript showCR: 'processing in top: ', aFileName.
        (aFileName endsWith:'.zip') ifTrue: [
            zipRdSub1 := ziprd extractArchive: aFileName.
            zipRdSub1 entries do: [:aFileName1|
                Transcript showCR: 'processing in sub 1: ', aFileName1.
                (aFileName1 endsWith:'.zip') ifTrue: [
                    zipRdSub2 := zipRdSub1 extractArchive: aFileName1.
                    zipRdSub2 entries do: [:aFileName2|
                        Transcript showCR: 'processing in sub 2: ', aFileName2.
                        (aFileName2 endsWith:'.zip') ifTrue: [
                            self halt.
                        ] ifFalse: [
                            entryDict at:aFileName2 put:(zipRdSub2 extract: aFileName2) asString.
                        ].
                    ].
                    zipRdSub2 closeFile.
                ] ifFalse: [
                    entryDict at:aFileName1 put:(zipRdSub1 extract: aFileName1) asString.
                ].
            ].
            zipRdSub1 closeFile.
        ] ifFalse: [
            entryDict at:aFileName put:(ziprd extract: aFileName) asString.
        ].
    ].
    ziprd closeFile.

    zipwr := ZipArchive newFileNamed:(testDirectory, testFileWr).
    entryDict keysAndValuesDo: [:key :value|
        (value size == 0) ifTrue: [
            zipwr addDirectory:key.
        ] ifFalse: [
            zipwr addFile:key withContents:value
        ].
    ].
    zipwr closeFile.


ST/X 6.1.1; WebServer 1.620 at exept:8081; Tue, 22 May 2012 23:24:59 GMT