Chris Muller uploaded a new version of Compression to project The Trunk: http://source.squeak.org/trunk/Compression-cmm.60.mcz
==================== Summary ====================
Name: Compression-cmm.60 Author: cmm Time: 28 January 2022, 7:29:13.629831 pm UUID: da1f9ad9-51bb-4815-83ba-706af4137db0 Ancestors: Compression-dtl.59, Compression-cmm.9
Don't leave open file-handles for each file added to a ZipArchive. Only open them when needed, and close them as soon as possible so the function isn't limited by availability of that resource.
=============== Diff against Compression-dtl.59 ===============
Item was changed: ----- Method: ZipArchive>>writeTo: (in category 'writing') ----- + writeTo: stream - writeTo: stream stream binary. + members do: [ : member | + [ member writeTo: stream. + member endRead ] ensure: [ member close ] ]. - members do: [ :member | - member writeTo: stream. - member endRead. - ]. writeCentralDirectoryOffset := stream position. + self writeCentralDirectoryTo: stream! - self writeCentralDirectoryTo: stream. - !
Item was changed: ----- Method: ZipFileMember>>readRawChunk: (in category 'private-reading') ----- readRawChunk: n + ^stream ensureOpen next: n! - ^stream next: n!
Item was changed: ----- Method: ZipFileMember>>rewindData (in category 'private-reading') ----- rewindData super rewindData. + stream isNil ifTrue: [ self error: 'stream missing' ]. + stream ensureOpen. + stream position: localHeaderRelativeOffset + 4. + self skipLocalDirectoryFileHeaderFrom: stream! - (stream isNil or: [ stream closed ]) - ifTrue: [ self error: 'stream missing or closed' ]. - stream position: (localHeaderRelativeOffset + 4). - self skipLocalDirectoryFileHeaderFrom: stream.!
Item was changed: ----- Method: ZipFileMember>>uncompressDataTo: (in category 'private-writing') ----- uncompressDataTo: aStream
| decoder buffer crcErrorMessage | + decoder := ZipReadStream on: stream ensureOpen. - decoder := ZipReadStream on: stream. decoder expectedCrc: self crc32. buffer := ByteArray new: (32768 min: readDataRemaining). crcErrorMessage := nil.
[[ readDataRemaining > 0 ] whileTrue: [ | chunkSize | chunkSize := 32768 min: readDataRemaining. buffer := decoder next: chunkSize into: buffer startingAt: 1. aStream next: chunkSize putAll: buffer startingAt: 1. readDataRemaining := readDataRemaining - chunkSize. ]] on: CRCError do: [ :ex | crcErrorMessage := ex messageText. ex proceed ].
crcErrorMessage ifNotNil: [ self isCorrupt: true. CRCError signal: crcErrorMessage ]
!
Item was changed: ----- Method: ZipFileMember>>uncompressDataTo:from:to: (in category 'private-writing') ----- uncompressDataTo: aStream from: start to: finish
| decoder buffer chunkSize | + decoder := FastInflateStream on: stream ensureOpen. - decoder := FastInflateStream on: stream. readDataRemaining := readDataRemaining min: finish - start + 1. buffer := ByteArray new: (32768 min: readDataRemaining). decoder next: start - 1.
[ readDataRemaining > 0 ] whileTrue: [ chunkSize := 32768 min: readDataRemaining. buffer := decoder next: chunkSize into: buffer startingAt: 1. aStream next: chunkSize putAll: buffer startingAt: 1. readDataRemaining := readDataRemaining - chunkSize. ]. !
Item was changed: ----- Method: ZipNewFileMember>>from: (in category 'initialization') ----- from: aFileName | entry | compressionMethod := CompressionStored. "Now get the size, attributes, and timestamps, and see if the file exists" + stream := (StandardFileStream readOnlyFileNamed: aFileName) close. - stream := StandardFileStream readOnlyFileNamed: aFileName. self localFileName: (externalFileName := stream name). entry := stream directoryEntry. compressedSize := uncompressedSize := entry fileSize. desiredCompressionMethod := compressedSize > 0 ifTrue: [ CompressionDeflated ] ifFalse: [ CompressionStored ]. + self setLastModFileDateTimeFrom: entry modificationTime + ! - self setLastModFileDateTimeFrom: entry modificationTime. - stream close!
Item was changed: ----- Method: ZipNewFileMember>>rewindData (in category 'private-writing') ----- rewindData super rewindData. + readDataRemaining := stream ensureOpen size. - readDataRemaining := stream size. stream position: 0.!
packages@lists.squeakfoundation.org