#FEATURE by exept
authorClaus Gittinger <cg@exept.de>
Mon, 08 Jul 2019 16:37:07 +0200
changeset 5053 5071b8fc2766
parent 5052 82fd57c1de33
child 5054 b01df68cba0a
#FEATURE by exept class: ZipArchive changed: #restoreOsDirectory:fromArchiveDirectory: allow '*' as archiveDirectory, to extract all
ZipArchive.st
--- 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.
+                    ].
+                ].
+            ].
+        ]
     ].
 !