2013-08-30 6 views
4

Как вы сжимаете каталог в Squeak Smalltalk? Я нашел метод compressFile в StandardFileStream, но я не могу понять, как сжать несколько файлов или каталог. Я экспериментировал с классами System-Compression, но не имел большой удачи. Заранее спасибо!Как сжать каталог в Squeak Smalltalk?

Это то, что у меня есть сейчас. Я добавляю метки времени в конце имен файлов, поэтому здесь я хочу поместить все файлы, начинающиеся с указанного имени файла, в файл 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. 
+0

Не могли бы вы опубликовать фрагмент кода, который вы пробовали и не работали. –

+0

Я просто добавил то, что у меня есть сейчас. Он работает, но когда я пытаюсь разархивировать его в терминале, я получаю эту ошибку: подпись в конце-центральной директории не найдена. Либо этот файл не является zipfile, либо он представляет собой один диск из многочастного архива. В последнем случае центральный каталог и комментарий zipfile будут найдены на последним диском (-ами) этого архива. unzip: не удается найти каталог zipfile в одном из test1.zip или test1.zip.zip и не может найти test1.zip.ZIP, period. –

ответ

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. 
+0

Спасибо за вашу помощь, но я думаю, что это решение для Pharo. Я не могу найти класс ZipArchive в Squeak. –

+1

@CharlotteHill какая версия писк? в серии 4.x ZipArchive классифицируется под Compression-Archives категория –

+0

Я использую версию 2, но я попробую обновить до 4. Спасибо! –