在Pharo中创建zip文件

时间:2018-03-27 08:13:34

标签: zip compression smalltalk pharo

如何在Pharo中创建zip文件并将其写入磁盘?

我以为我可以在MemoryStore中创建结构然后将其压缩如下

root := FileSystem memory root ensureCreateDirectory.

root / 'sample.txt' writeStreamDo: [ :stream | stream << String loremIpsum ].

archive := ZipArchive new.
root allChildren select: #isFile thenDo: [ :each |
    each readStreamDo: [ :readStream |
        archive addString: readStream contents as: each fullName
    ]
].
archive writeTo: someFinalWriteStream.

archive close.

但显然通过addString:as:添加的数据根本没有压缩。

同样addFile: / addFile:as:不可用,因为该实现仅适用于真实磁盘,而不适用于内存。

还有一些其他的方法(或外部库),我可以使用它来压缩我的数据,而无需将所有文件转储到磁盘,将其压缩并读回最终文件?

1 个答案:

答案 0 :(得分:3)

尝试一下以下内容:

string := String new: 14 withAll: $1.
archive := ZipArchive new.
member := zip addDeflateString: string as: 'filename.ext'.
member instVarNamed: 'compressionMethod' put: 8.
member rewindData.
zip := ByteArray streamContents: [:strm | member compressDataTo: strm].

请注意,我已强制设置compressionMethod,必须有更好的方法来执行此操作,并且我确定您会找到它;)