Как вы сжимаете каталог в Squeak Smalltalk?

Как вы сжимаете каталог в Squeak Smalltalk? Я нашел метод compressFile в StandardFileStream, но не могу понять, как сжимать несколько файлов или каталогов. Я экспериментировал с классами 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.

person Charlotte Hill    schedule 30.08.2013    source источник
comment
Не могли бы вы опубликовать фрагмент кода, который вы пробовали и не работали.   -  person z--    schedule 31.08.2013
comment
Я просто добавил то, что есть сейчас. Он запускается, но когда я пытаюсь разархивировать его в терминале, я получаю эту ошибку: Подпись конца центрального каталога не найдена. Либо этот файл не является zip-файлом, либо представляет собой один диск многокомпонентного архива. В последнем случае центральный каталог и комментарий к zip-файлу будут находиться на последних дисках этого архива. распаковать: не удается найти каталог zipfile в одном из test1.zip или test1.zip.zip, и не удается найти test1.zip.ZIP, и точка.   -  person Charlotte Hill    schedule 01.09.2013


Ответы (1)


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.
person Vanessa Freudenberg    schedule 02.09.2013
comment
Спасибо за вашу помощь, но я думаю, что это решение для Pharo. Я не могу найти класс ZipArchive в Squeak. - person Charlotte Hill; 02.09.2013
comment
@CharlotteHill, какая версия писка? в серии 4.x ZipArchive относится к категории «Сжатые архивы». - person aka.nice; 02.09.2013
comment
Я использую версию 2, но я попробую обновиться до 4. Спасибо! - person Charlotte Hill; 03.09.2013
comment
Да, ZipArchive был добавлен после 2.x. Если вы можете использовать текущую версию Squeak, то отлично, это гораздо более приятная система. Если нет, скажем, из-за того, что вы используете Scratch-образ, который был сильно настроен, то использование ZipArchive из более поздней версии может быть вашим лучшим вариантом. Загрузите ftp.squeak.org/3.2/win/Squeak3 .2-4956-win-full.zip и вытащите из него категорию System-Archives, заархивируйте его в свой образ, может так получиться. Возможно, вам также понадобится категория System-Compression. - person Vanessa Freudenberg; 03.09.2013