Страница 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 проблема не наблюдалась).