#FEATURE by exept
class: ZipArchive
changed: #restoreOsDirectory:fromArchiveDirectory:
allow '*' as archiveDirectory, to extract all
--- a/ZipArchive.st Fri Jun 28 09:25:23 2019 +0200
+++ b/ZipArchive.st Mon Jul 08 16:37:07 2019 +0200
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
"
COPYRIGHT (c) 1998 by eXept Software AG
All Rights Reserved
@@ -4128,60 +4130,70 @@
"Modified: / 10-12-2012 / 05:41:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
-restoreOsDirectory:osDirectoryName fromArchiveDirectory: archiveDirectoryName
+restoreOsDirectory:osDirectoryName fromArchiveDirectory:archiveDirectoryName
+ "extracts all files from an archiveDirectory
+ into a folder"
+
|osDirectory directoryAlreadyCreated archiveDirectoryNameSize|
osDirectory := osDirectoryName asFilename.
directoryAlreadyCreated := osDirectory exists.
(directoryAlreadyCreated and: [osDirectory isDirectory not]) ifTrue:[
- "no way to create the base directory - done"
- OperatingSystem accessDeniedErrorSignal
- raiseRequestWith:osDirectory
- errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
- ^ self.
+ "no way to create the base directory - done"
+ OperatingSystem accessDeniedErrorSignal
+ raiseRequestWith:osDirectory
+ errorString:(' - ZipArchive - cannot create base directory: ' , osDirectory asString).
+ ^ self.
].
archiveDirectoryNameSize := archiveDirectoryName size.
self members do: [:eachZipArchiveMember|
- |eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
-
- eachZipArchiveMemberName := eachZipArchiveMember fileName.
-
- ((eachZipArchiveMemberName startsWith:archiveDirectoryName)
- and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
- or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]]) ifTrue: [
-
- directoryAlreadyCreated ifFalse:[
- osDirectory recursiveMakeDirectory.
- directoryAlreadyCreated := true.
- ].
- baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
- (baseName notEmpty and:[baseName first == $/]) ifTrue:[
- baseName := baseName copyFrom:2.
- ].
-
- baseName notEmpty ifTrue:[
- fileNameOrDirectoryEntry := osDirectory construct:baseName.
-
- "Note, that a ZipArchive usually does not contain entries for directories!!"
- (eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
- fileNameOrDirectoryEntry recursiveMakeDirectory.
- ] ifFalse: [
- "make sure, that the directory exists"
- directory := fileNameOrDirectoryEntry directory.
- directory isDirectory ifFalse:[
- directory recursiveMakeDirectory.
- ].
-
- fileNameOrDirectoryEntry writingFileDo:[:aStream|
- self
- extract:eachZipArchiveMemberName
- intoStream: aStream.
- ].
- ].
- ].
- ]
+ |eachZipArchiveMemberName baseName directory fileNameOrDirectoryEntry|
+
+ eachZipArchiveMemberName := eachZipArchiveMember fileName.
+
+ (archiveDirectoryName = '*'
+ or:[
+ ((eachZipArchiveMemberName startsWith:archiveDirectoryName)
+ and:[eachZipArchiveMemberName size = archiveDirectoryNameSize
+ or:[(eachZipArchiveMemberName at:archiveDirectoryNameSize+1) == $/]])
+ ]) ifTrue: [
+
+ directoryAlreadyCreated ifFalse:[
+ osDirectory recursiveMakeDirectory.
+ directoryAlreadyCreated := true.
+ ].
+ archiveDirectoryName = '*' ifTrue:[
+ baseName := eachZipArchiveMemberName.
+ ] ifFalse:[
+ baseName := eachZipArchiveMemberName copyFrom:(archiveDirectoryNameSize+1).
+ ].
+ (baseName notEmpty and:[baseName first == $/]) ifTrue:[
+ baseName := baseName copyFrom:2.
+ ].
+
+ baseName notEmpty ifTrue:[
+ fileNameOrDirectoryEntry := osDirectory construct:baseName.
+
+ "Note, that a ZipArchive usually does not contain entries for directories!!"
+ (eachZipArchiveMember externalFileAttributes bitTest:EXTERNALFILEATTRIBUTES_ISDIRECTORY) ifTrue:[
+ fileNameOrDirectoryEntry recursiveMakeDirectory.
+ ] ifFalse: [
+ "make sure, that the directory exists"
+ directory := fileNameOrDirectoryEntry directory.
+ directory isDirectory ifFalse:[
+ directory recursiveMakeDirectory.
+ ].
+
+ fileNameOrDirectoryEntry writingFileDo:[:fileStream|
+ self
+ extract:eachZipArchiveMemberName
+ intoStream: fileStream.
+ ].
+ ].
+ ].
+ ]
].
!