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| |