#BUGFIX by cg
class: Archiver::ZipArchive
comment/format in: #extractFiles:to:
changed: #extractFilesUsingBuiltinZipArchiver:from:to:
--- 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.
!