4

Squeak Smalltalk でディレクトリを圧縮するにはどうすればよいですか? StandardFileStream で compressFile メソッドを見つけましたが、複数のファイルまたはディレクトリを圧縮する方法がわかりません。System-Compression クラスを試してみましたが、うまくいきませんでした。前もって感謝します!

これは私が今持っているものです。ファイル名の末尾にタイムスタンプを追加しているので、ここでは、指定されたファイル名で始まるすべてのファイルを zip または gzip ファイルに入れたいと考えています。

compressFile: aFileName in: aDirectory

| zipped buffer unzipped zipFileName |
zipFileName _ aFileName copyUpTo: $. .
zipped _ aDirectory newFileNamed: (zipFileName, FileDirectory dot, 'zip').
zipped binary; setFileTypeToObject.
zipped _ ZipWriteStream on: zipped.
buffer _ ByteArray new: 50000.  
aDirectory fileNames do: [:f |
    (f beginsWith: zipFileName) ifTrue: [
        unzipped _ aDirectory readOnlyFileNamed: (aDirectory fullNameFor: f).
        unzipped binary.
        [unzipped atEnd] whileFalse:[
            zipped nextPutAll: (unzipped nextInto: buffer)].
        unzipped close]].
zipped close.
4

1 に答える 1

6

ZipWriteStream圧縮に使用されるヘルパー クラスにすぎません。すべてのヘッダーやディレクトリ情報などを含む、適切な ZIP ファイルがどのように配置されているかはわかりません。このZipArchiveクラスを使用したいと考えています。

"first, construct archive layout in memory"
zip := ZipArchive new.
zip addFile: 'foo.txt'.
zip addFile: 'bar.txt' as: 'xyz.txt'.
zip addTree: dir match: [:entry | entry name beginswith: 'baz'].
"then, write archive to disk, compressing each member"
file := dest newFileNamed: 'test.zip'.
zip writeTo: file.
file close.
于 2013-09-02T11:37:52.233 に答える