#BUGFIX by cg
authorClaus Gittinger <cg@exept.de>
Fri, 13 Dec 2019 17:22:18 +0100
changeset 5369 f64acbdfd05c
parent 5368 17fbe26c92e3
child 5370 b868e173b9fd
#BUGFIX by cg class: Archiver::ZipArchive comment/format in: #extractFiles:to: changed: #extractFilesUsingBuiltinZipArchiver:from:to:
Archiver.st
--- a/Archiver.st	Fri Dec 13 16:50:19 2019 +0100
+++ b/Archiver.st	Fri Dec 13 17:22:18 2019 +0100
@@ -1557,37 +1557,47 @@
 
 !Archiver::ZipArchive methodsFor:'actions'!
 
-extractFiles:colOfFiles to:aDirectory
+extractFiles:colOfFilesOrNilForAll to:aDirectory
     "called both to really extract, 
      and to extract to a temporary file to view it"
 
     self useBuiltinArchiver ifTrue:[
-        self extractFilesUsingBuiltinZipArchiver:colOfFiles from:self fileName to:aDirectory.
+        self extractFilesUsingBuiltinZipArchiver:colOfFilesOrNilForAll from:self fileName to:aDirectory.
         ^ self
     ].
-    ^ super extractFiles:colOfFiles to:aDirectory.
+    ^ super extractFiles:colOfFilesOrNilForAll to:aDirectory.
 !
 
-extractFilesUsingBuiltinZipArchiver:colOfArchivItems from:fn to:aDirectory
+extractFilesUsingBuiltinZipArchiver:colOfArchivItemsOrNilForAll from:fn to:aDirectory
     "called both to really extract, 
      and to extract to a temporary file to view it"
 
-    |zip|
+    |zip names|
 
     zip := Smalltalk::ZipArchive oldFileNamed:fn.
-    colOfArchivItems do:[:eachItem |
-        |nm targetFn|
+    colOfArchivItemsOrNilForAll isNil ifTrue:[
+        names := zip entries.
+    ] ifFalse:[
+        names := colOfArchivItemsOrNilForAll collect:#fileName
+    ].
+    names do:[:eachName |
+        |entry targetFn|
 
-        nm := eachItem fileName.
-        self assert:(nm includesString:'..') not.
-        self assert:nm asFilename isAbsolute not.
+        self assert:(eachName includesString:'..') not.
+        self assert:eachName asFilename isAbsolute not.
 
-        targetFn := aDirectory construct:nm.
-        targetFn directory recursiveMakeDirectory.
+        targetFn := aDirectory construct:eachName.
 
-        targetFn writingFileDo:[:s |
-            zip extract:nm toStream:s.
-        ].
+        entry := zip memberNamed:eachName.
+        entry isDirectory ifTrue:[
+            targetFn recursiveMakeDirectory.
+        ] ifFalse:[
+            targetFn directory recursiveMakeDirectory.
+
+            targetFn writingFileDo:[:s |
+                zip extract:eachName toStream:s.
+            ].
+        ]
     ].
     zip close.
 !