Архивация ZIP без ... ZIP

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Привет всем !

Нет ли у кого-нибудь примера на Clarion как можно запаковать / распаковать ZIP архив без внешних DLL,
а с использованием только WindowAPI, например Shell32 ?

На сях пример нарыл, но что-то перевод на Clarion не получается. То ли чего-то не понимаю, то ли руки кривые ... ;)

Заранее спасибо, если вдруг у кого найдется, что сказать по этому поводу.
Make Clarion Great Again ! 😎
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Admin »

Используем поиск по форуму: zlib
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Admin писал(а):Используем поиск по форуму: zlib
Э, нет ! Как работать с ZLIB я прекрасно знаю. В том, то и фишка, что бы отцепить от программы "ненужные" DLL ....
В WinAPi все что нужно для элементарной работы с ZIP архивами и так есть, без сторонних DLL.
Make Clarion Great Again ! 😎
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Admin »

Берем исходники zlib и перегоняем на Clarion "c"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Admin писал(а):Берем исходники zlib и перегоняем на Clarion "c"
Тоже вариант. Или просто пишем на Clarion ZIP архивацию, что думаю тоже возможно.
Ладно, немного разгребусь с текучкой - попробую еще покапаться с Shell32.
Если что-то путное получится, выложу в форум для обсуждения.
Make Clarion Great Again ! 😎
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Admin »

Игорь Столяров писал(а):Ладно, немного разгребусь с текучкой - попробую еще покапаться с Shell32.
В W2K Shell32 нет zip функционала.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Admin писал(а):В W2K Shell32 нет zip функционала.
Тоже верно, но он есть начиная с WinXP/2003. В принципе этого достаточно, все-таки Win2K уже практически не встречается.
К тому же при использовании Shell32 мы можем просто обработатать ошибку на момент инициализации объекта и выдать сообщение
о недопустимости конкретной операции, сохранив в целом функциональность приложения.

Я поясню, зачем стараюсь избавится от различных DLL десятилетней давности. Есть некоторые, достаточно трудно отлавливаемые
проблемы при работе приложений под эмуляторами Windows в Mac OS и Linux. Я имел обширную переписку с разработчиками этих
эмуляторов и в итоге все сводится к одному. Чем меньше будет "старых" DLL непонятного происхождения, написаных и собранных
во времена вышеупомянутой Win2K - тем лучше. Особенно в контексте работы приложения x32 под ОС x64 в режиме совместимости.
В идеале - программа должна работать с WinAPI, тогда проблем не будет или они легко локализуемы и устраняемы.
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Все оказалось намного проще, чем предполагалось.
Как и обещал публикую код для архивации файла в 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}
    
Все ! :)
Последний раз редактировалось Игорь Столяров 19 Август 2012, 16:07, всего редактировалось 1 раз.
Make Clarion Great Again ! 😎
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: Архивация ZIP без ... ZIP

Сообщение Shur »

Спасибо Игорю за приведённый код.
Попробовал. Работает. Потестировал и таки нашёл недостаток, впрочем довольно типичный для зипперов.
Короче, у меня кириллические имена файлов сохраняются в архиве в искажённом виде (кракозябрами).
И это, к сожалению, как-то сразу снижает ценность данного метода на постсоветском пространстве.

Надо бы ещё проверить на раззиповке...
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Admin »

Подозреваю что может получиться если имя файла в Unicode передавать.
Хотя старые архиваторы вроде этого не понимают.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Admin писал(а):Подозреваю что может получиться если имя файла в Unicode передавать.
А я делаю ставку на кодировку в BASE64.
По крайне мере именно так решается проблема с кодировкой имен файлов в национальном алфавите при
добавлении файла в структуру MIME (сообщение для отправки по e-mail).
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

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 папками и т.д.
Make Clarion Great Again ! 😎
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Yufil »

Вроде бы Zip хранит имена файлов в OEM-кодировке, по крайней мере, для Zlib'а приходилось перекодировать
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Архивация ZIP без ... ZIP

Сообщение Admin »

Yufil писал(а):Вроде бы Zip хранит имена файлов в OEM-кодировке, по крайней мере, для Zlib'а приходилось перекодировать
Похоже так и есть
http://vostryakov.ru/blog/24-russkie-im ... -i-python/
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8033
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Архивация ZIP без ... ZIP

Сообщение Игорь Столяров »

Немного подправил синтаксис архивации "Items()" лучше писать с скобками, т.к. это функция.
Иначе под Win7 почему-то через два раза на третий ругалась на синтаксис или подвисала (под WinXP проблема не наблюдалась).
Make Clarion Great Again ! 😎
Ответить