Страница 1 из 2
Архивация ZIP без ... ZIP
Добавлено: 02 Июль 2012, 11:33
Игорь Столяров
Привет всем !
Нет ли у кого-нибудь примера на Clarion как можно запаковать / распаковать ZIP архив без внешних DLL,
а с использованием только WindowAPI, например Shell32 ?
На сях пример нарыл, но что-то перевод на Clarion не получается. То ли чего-то не понимаю, то ли руки кривые ...
Заранее спасибо, если вдруг у кого найдется, что сказать по этому поводу.
Re: Архивация ZIP без ... ZIP
Добавлено: 02 Июль 2012, 18:58
Admin
Используем поиск по форуму: zlib
Re: Архивация ZIP без ... ZIP
Добавлено: 02 Июль 2012, 19:43
Игорь Столяров
Admin писал(а):Используем поиск по форуму: zlib
Э, нет ! Как работать с ZLIB я прекрасно знаю. В том, то и фишка, что бы отцепить от программы "ненужные" DLL ....
В WinAPi все что нужно для элементарной работы с ZIP архивами и так есть, без сторонних DLL.
Re: Архивация ZIP без ... ZIP
Добавлено: 03 Июль 2012, 2:51
Admin
Берем исходники zlib и перегоняем на Clarion "c"
Re: Архивация ZIP без ... ZIP
Добавлено: 03 Июль 2012, 6:48
Игорь Столяров
Admin писал(а):Берем исходники zlib и перегоняем на Clarion "c"
Тоже вариант. Или просто пишем на Clarion ZIP архивацию, что думаю тоже возможно.
Ладно, немного разгребусь с текучкой - попробую еще покапаться с Shell32.
Если что-то путное получится, выложу в форум для обсуждения.
Re: Архивация ZIP без ... ZIP
Добавлено: 03 Июль 2012, 7:06
Admin
Игорь Столяров писал(а):Ладно, немного разгребусь с текучкой - попробую еще покапаться с Shell32.
В W2K Shell32 нет zip функционала.
Re: Архивация ZIP без ... ZIP
Добавлено: 03 Июль 2012, 8:08
Игорь Столяров
Admin писал(а):В W2K Shell32 нет zip функционала.
Тоже верно, но он есть начиная с WinXP/2003. В принципе этого достаточно, все-таки Win2K уже практически не встречается.
К тому же при использовании Shell32 мы можем просто обработатать ошибку на момент инициализации объекта и выдать сообщение
о недопустимости конкретной операции, сохранив в целом функциональность приложения.
Я поясню, зачем стараюсь избавится от различных DLL десятилетней давности. Есть некоторые, достаточно трудно отлавливаемые
проблемы при работе приложений под эмуляторами Windows в Mac OS и Linux. Я имел обширную переписку с разработчиками этих
эмуляторов и в итоге все сводится к одному. Чем меньше будет "старых" DLL непонятного происхождения, написаных и собранных
во времена вышеупомянутой Win2K - тем лучше. Особенно в контексте работы приложения x32 под ОС x64 в режиме совместимости.
В идеале - программа должна работать с WinAPI, тогда проблем не будет или они легко локализуемы и устраняемы.
Re: Архивация ZIP без ... ZIP
Добавлено: 16 Август 2012, 12:40
Игорь Столяров
Все оказалось намного проще, чем предполагалось.
Как и обещал публикую код для архивации файла в ZIP без всяких DLL, средствами Windows.
Распаковка практически аналогична - поэтому неинтересна.
Код: Выделить всё
CreateZIPFile PROCEDURE
Loc:STR STRING(22)
Loc:Object CSTRING(65)
CODE
! --- Сформировать пустой ZIP файл ---
Loc:STR = '<80><75><5><6>' & All(Chr(0),18) ! Бинарное содержание пустого ZIP файла
WriteStringToFile(Loc:STR,'c:\archiv.zip') ! Некая процедура для запись строки в DOS файл
Loc:Object = Create(0,Create:Ole)
Loc:Object{Prop:Create} = 'Shell.Application'
Loc:Object{Prop:ReportException} = True ! Выдавать сообщения об ошибках - можно убрать
! Записать файл shet.doc в архив archiv.zip
Loc:Object{'NameSpace("c:\archiv.zip").CopyHere("c:\shet.doc",20)'}
! Дождаться завершения архивации, иначе получим GPF
Loop until Loc:Object{'NameSpace("c:\archiv.zip").Items().Count'} = 1
Yield
end
! Удалить используемый объект и освободить память
Loc:Object{Prop:Deactivate}
Все !

Re: Архивация ZIP без ... ZIP
Добавлено: 17 Август 2012, 11:28
Shur
Спасибо Игорю за приведённый код.
Попробовал. Работает. Потестировал и таки нашёл недостаток, впрочем довольно типичный для зипперов.
Короче, у меня кириллические имена файлов сохраняются в архиве в искажённом виде (кракозябрами).
И это, к сожалению, как-то сразу снижает ценность данного метода на постсоветском пространстве.
Надо бы ещё проверить на раззиповке...
Re: Архивация ZIP без ... ZIP
Добавлено: 17 Август 2012, 13:12
Admin
Подозреваю что может получиться если имя файла в Unicode передавать.
Хотя старые архиваторы вроде этого не понимают.
Re: Архивация ZIP без ... ZIP
Добавлено: 17 Август 2012, 13:51
Игорь Столяров
Admin писал(а):Подозреваю что может получиться если имя файла в Unicode передавать.
А я делаю ставку на кодировку в BASE64.
По крайне мере именно так решается проблема с кодировкой имен файлов в национальном алфавите при
добавлении файла в структуру MIME (сообщение для отправки по e-mail).
Re: Архивация ZIP без ... ZIP
Добавлено: 17 Август 2012, 16:26
Игорь Столяров
Shur писал(а):Надо бы ещё проверить на раззиповке...
Код: Выделить всё
Loc:Object CSTRING(65)
ZipFile_ CSTRING(255)
DestFolder_ = CSTRING(255)
CODE
Loc:Object = Create(0,Create:Ole)
Loc:Object{Prop:Create} = 'Shell.Application'
Loc:Object{Prop:ReportException} = True
ZipFile_ = 'c:\archiv.zip'
DestFolder_ = 'c:\'
Loc:Object{'NameSpace("' & DestFolder_ & '").CopyHere(' & Clip(Loc:Object{'NameSpace("' & ZipFile_ & '").Items()'}) & ',20)'}
Loc:Object{Prop:Deactivate}
Распаковка ZIP архива проще. Там можно еще наворачивать с вложенными в ZIP папками и т.д.
Re: Архивация ZIP без ... ZIP
Добавлено: 17 Август 2012, 17:32
Yufil
Вроде бы Zip хранит имена файлов в OEM-кодировке, по крайней мере, для Zlib'а приходилось перекодировать
Re: Архивация ZIP без ... ZIP
Добавлено: 18 Август 2012, 3:39
Admin
Yufil писал(а):Вроде бы Zip хранит имена файлов в OEM-кодировке, по крайней мере, для Zlib'а приходилось перекодировать
Похоже так и есть
http://vostryakov.ru/blog/24-russkie-im ... -i-python/
Re: Архивация ZIP без ... ZIP
Добавлено: 19 Август 2012, 16:10
Игорь Столяров
Немного подправил синтаксис архивации "Items()" лучше писать с скобками, т.к. это функция.
Иначе под Win7 почему-то через два раза на третий ругалась на синтаксис или подвисала (под WinXP проблема не наблюдалась).