ZipArchive.st
changeset 5053 5071b8fc2766
parent 4950 4776fa17a3d0
child 5167 cf84949dd61b
equal deleted inserted replaced
5052:82fd57c1de33 5053:5071b8fc2766
       
     1 "{ Encoding: utf8 }"
       
     2 
     1 "
     3 "
     2  COPYRIGHT (c) 1998 by eXept Software AG
     4  COPYRIGHT (c) 1998 by eXept Software AG
     3 	      All Rights Reserved
     5 	      All Rights Reserved
     4 
     6 
     5  This software is furnished under a license and may be used
     7  This software is furnished under a license and may be used
  4126 
  4128 
  4127     "Created: / 01-05-2011 / 16:21:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  4129     "Created: / 01-05-2011 / 16:21:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  4128     "Modified: / 10-12-2012 / 05:41:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  4130     "Modified: / 10-12-2012 / 05:41:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  4129 !
  4131 !
  4130 
  4132 
  4131 restoreOsDirectory:osDirectoryName fromArchiveDirectory: archiveDirectoryName
  4133 restoreOsDirectory:osDirectoryName fromArchiveDirectory:archiveDirectoryName
       
  4134     "extracts all files from an archiveDirectory
       
  4135      into a folder"
       
  4136 
  4132     |osDirectory directoryAlreadyCreated archiveDirectoryNameSize|
  4137     |osDirectory directoryAlreadyCreated archiveDirectoryNameSize|
  4133 
  4138 
  4134     osDirectory := osDirectoryName asFilename.
  4139     osDirectory := osDirectoryName asFilename.
  4135     directoryAlreadyCreated := osDirectory exists.
  4140     directoryAlreadyCreated := osDirectory exists.
  4136     (directoryAlreadyCreated and: [osDirectory isDirectory not]) ifTrue:[
  4141     (directoryAlreadyCreated and: [osDirectory isDirectory not]) ifTrue:[
  4137 	"no way to create the base directory - done"
  4142         "no way to create the base directory - done"
  4138 	OperatingSystem accessDeniedErrorSignal
  4143         OperatingSystem accessDeniedErrorSignal
  4139 	    raiseRequestWith:osDirectory
  4144             raiseRequestWith:osDirectory
  4140 	    errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
  4145             errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
  4141 	^ self.
  4146         ^ self.
  4142     ].
  4147     ].
  4143 
  4148 
  4144     archiveDirectoryNameSize := archiveDirectoryName size.
  4149     archiveDirectoryNameSize := archiveDirectoryName size.
  4145 
  4150 
  4146     self members do: [:eachZipArchiveMember|
  4151     self members do: [:eachZipArchiveMember|
  4147 	|eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
  4152         |eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
  4148 
  4153 
  4149 	eachZipArchiveMemberName := eachZipArchiveMember fileName.
  4154         eachZipArchiveMemberName := eachZipArchiveMember fileName.
  4150 
  4155 
  4151 	((eachZipArchiveMemberName startsWith:archiveDirectoryName)
  4156         (archiveDirectoryName = '*'
  4152 	 and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
  4157         or:[
  4153 	      or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]]) ifTrue: [
  4158             ((eachZipArchiveMemberName startsWith:archiveDirectoryName)
  4154 
  4159              and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
  4155 	    directoryAlreadyCreated ifFalse:[
  4160                   or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]])
  4156 		osDirectory recursiveMakeDirectory.
  4161         ]) ifTrue: [
  4157 		directoryAlreadyCreated := true.
  4162 
  4158 	    ].
  4163             directoryAlreadyCreated ifFalse:[
  4159 	    baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
  4164                 osDirectory recursiveMakeDirectory.
  4160 	    (baseName notEmpty and:[baseName first == $/]) ifTrue:[
  4165                 directoryAlreadyCreated := true.
  4161 		baseName := baseName copyFrom:2.
  4166             ].
  4162 	    ].
  4167             archiveDirectoryName = '*' ifTrue:[
  4163 
  4168                 baseName := eachZipArchiveMemberName.
  4164 	    baseName notEmpty ifTrue:[
  4169             ] ifFalse:[
  4165 		fileNameOrDirectoryEntry := osDirectory construct:baseName.
  4170                 baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
  4166 
  4171             ].
  4167 		"Note, that a ZipArchive usually does not contain entries for directories!!"
  4172             (baseName notEmpty and:[baseName first == $/]) ifTrue:[
  4168 		(eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
  4173                 baseName := baseName copyFrom:2.
  4169 		    fileNameOrDirectoryEntry recursiveMakeDirectory.
  4174             ].
  4170 		] ifFalse: [
  4175 
  4171 		    "make sure, that the directory exists"
  4176             baseName notEmpty ifTrue:[
  4172 		    directory := fileNameOrDirectoryEntry directory.
  4177                 fileNameOrDirectoryEntry := osDirectory construct:baseName.
  4173 		    directory isDirectory ifFalse:[
  4178 
  4174 			directory recursiveMakeDirectory.
  4179                 "Note, that a ZipArchive usually does not contain entries for directories!!"
  4175 		    ].
  4180                 (eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
  4176 
  4181                     fileNameOrDirectoryEntry recursiveMakeDirectory.
  4177 		    fileNameOrDirectoryEntry writingFileDo:[:aStream|
  4182                 ] ifFalse: [
  4178 			self
  4183                     "make sure, that the directory exists"
  4179 			    extract:eachZipArchiveMemberName
  4184                     directory := fileNameOrDirectoryEntry directory.
  4180 			    intoStream: aStream.
  4185                     directory isDirectory ifFalse:[
  4181 		    ].
  4186                         directory recursiveMakeDirectory.
  4182 		].
  4187                     ].
  4183 	    ].
  4188 
  4184 	]
  4189                     fileNameOrDirectoryEntry writingFileDo:[:fileStream|
       
  4190                         self
       
  4191                             extract:eachZipArchiveMemberName
       
  4192                             intoStream: fileStream.
       
  4193                     ].
       
  4194                 ].
       
  4195             ].
       
  4196         ]
  4185     ].
  4197     ].
  4186 !
  4198 !
  4187 
  4199 
  4188 withPositionAndMemberFor:fileName do:aBlock
  4200 withPositionAndMemberFor:fileName do:aBlock
  4189     |zmemb dataStart|
  4201     |zmemb dataStart|