Как компресирате директория в 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 файл, или представлява един диск от архив от няколко части. В последния случай централната директория и коментарът на zipfile ще бъдат намерени на последния диск(ове) на този архив. unzip: не може да намери директория на 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 коя версия на squeak? в серия 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