Работа с ZIP архивами.
| |
PBPROG | Дата: Вторник, 15 Марта 2011, 00:55 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| На просторах инета нашел интересную на мой взгляд статью о работе с ZIP архивами, может еще кому будет интересна. --------------------------------------------- Для уменьшения размера файлов, их обычно сжимают - архивируют. Существует много типов архивов, но сейчас мы поговорим о ZIP архивах. Для работы с ZIP архивами, нужно скачать и установить библиотеку PureZIP. Теперь создадим простейшую программу, упаковывающую один файл в архив. Code ; Создаем архив с именем MyArchive.ZIP в корне диска C: If PureZIP_Archive_Create("C:\MyArchive.ZIP",#APPEND_STATUS_CREATE) If PureZIP_Archive_Compress("C:\WINDOWS\NOTEPAD.exe",#False)=#Z_OK MessageRequester("","Файл успешно добавлен в архив", 64) Else MessageRequester("","Ошибка при добавлении файла в архив", 48) EndIf PureZIP_Archive_Close(); Закрываем файл архива. Else MessageRequester("","Не удалось создать архив", 64) EndIf End Как видите, этот код, создает архив с именем MyArchive.ZIP на диске C:. Если архив был успешно создан, то в него добавляется файл NOTEPAD.exe, расположенный в системной папке ОС. Этот архив можно открыть любым архиватором, поддерживающим работу с ZIP, например WinRAR. Нужно отметить, в некоторых операционных системах, архив может не создастся на диске, из-за отсутствия прав доступа к диску C:, который обычно является системным диском. Если такое произошло (появилось сообщение "Не удалось создать архив"), то просто укажите другое место сохранения архива. Это же касается и добавляемого файла, к которому задан абсолютный путь. Вполне возможно что путь к системной папке окажется другим и файл NOTEPAD.exe не будет обнаружен. В этом случае, нужно указать правильный путь или выбрать другой файл для архивирования. Теперь создадим заготовку для программы архивирования и распаковки множества файлов и папок. Code ;- Window Constants Enumeration #Window_0 EndEnumeration ;- Gadget Constants Enumeration #Text_0 #String_0 #Text_1 #String_1 #Text_2 #Text_CurrentFiles #ProgressBar_FileProgress # Text_4 #ProgressBar_AllProgress #Button_Archive #Button_1 #Button_2 #Text_5 #String_Password EndEnumeration P rocedure Open_Window_0() If OpenWindow(#Window_0, 344, 256, 334, 264,"ZIP архиватор (упаковщик)",#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered) TextGadget(#Text_0, 5, 5, 320, 15,"Путь к папке с файлами:") StringGadget(#String_0, 5, 20, 290, 20,"",#PB_String_ReadOnly) TextGadget(#Text_1, 5, 55, 320, 15,"Путь к месту сохранения создаваемого архива:") StringGadget(#String_1, 5, 70, 290, 20,"",#PB_String_ReadOnly) TextGadget(#Text_2, 5, 140, 100, 15,"Обработка файла:") TextGadget(#Text_CurrentFiles, 105, 140, 220, 15,"") ProgressBarGadget(#ProgressBar_FileProgress, 5, 155, 320, 15, 0, 100,#PB_ProgressBar_Smooth) TextGadget(#Text_4, 5, 185, 150, 15,"Общий прогресс:") ProgressBarGadget(#ProgressBar_AllProgress, 5, 200, 320, 15, 0, 100,#PB_ProgressBar_Smooth) ButtonGadget(#Button_Archive, 80, 230, 190, 25,"Создать архив") ButtonGadget(#Button_1, 300, 20, 30, 20,"...") ButtonGadget(#Button_2, 300, 70, 30, 20,"...") TextGadget(#Text_5, 5, 105, 85, 15,"Пароль архива:") StringGadget(#String_Password, 95, 100, 200, 20,"") EndIf EndProcedure Procedure File_Progress(File.s, PerCent.f, UserParam.l); Отображение в окне, прогресса упаковки текущего файла SetGadgetText(#Text_CurrentFiles, File) SetGadgetState(#ProgressBar_FileProgress, PerCent) While WindowEvent(): Wend EndProcedure Procedure All_Progress(File.s, PerCent.f, UserParam.l); Отображение в окне, общего прогресса упаковки файлов SetGadgetState(#ProgressBar_AllProgress, PerCent) While WindowEvent(): Wend EndProcedure Procedure Button_Archive(Directory.s, File.s) MessageRequester("","Функция не реализована"+Chr(10)+"Это только каркас программы", 64) EndProcedure Open_Window_0() PureZIP_SetCompressionCallback(@File_Progress()); Регистрация процедуры прогресса упаковки файлов PureZIP_SetProgressionCallback(@All_Progress()); Регистрация процедуры общего прогресса упаковки Repeat ; Главный цикл Repeat - Until Event = WaitWindowEvent(); Идентификатор события If Event =#PB_Event_Gadget Select EventGadget(); Идентификатор гаджета по которому кликнули Case #Button_1; Кнопка выбора папки с файлами Path.s=PathRequester("Укажите путь к архивируемым файлам","") If FileSize(Path)=-2 ; Папка существует SetGadgetText(#String_0, Path) EndIf Case #Button_2; Кнопка выбора места сохранения архива File.s=SaveFileRequester("","","ZIP архивы|*.zip|Все файлы|*.*",0) If File<>"" If GetExtensionPart(File)=""; Неуказанно расширение файла File+".zip" EndIf SetGadgetText(#String_1, File) EndIf
Case #Button_Archive; Кнопка создания архива String1.s=GetGadgetText(#String_0) String2.s=GetGadgetText(#String_1) If String1<>"" And String2<>"" Password.s = GetGadgetText(#String_Password); Пароль архива PureZIP_SetArchivePassword(Password) Button_Archive(String1, String2) Else MessageRequester("","Заполните поля!", 48) EndIf EndSelect EndIf Until Event =#PB_Event_CloseWindow Процедура Open_Window_0 создает окно со всеми гаджетами (текстовыми надписями, полями ввода текста, кнопками, прогресс-барами и т. д.). Процедуры File_Progress и All_Progress служат для отображения текущего прогресса обработки файла и общего прогресса, соответственно. А процедура Button_Archive, вызывается при каждом клике по кнопке с надписью "Создать архив" и ей через аргументы, передаются путь к папке и файлу, находящийся в соответствующих полях окна программы. От кода данной процедуры, зависит поведение программы при клике по этой кнопке. Программа начинает выполнятся с вызова процедуры Open_Window_0, которая создает окно со всеми гаджетами. Далее, в библиотеке PureZIP с помощью функций PureZIP_SetCompressionCallback и PureZIP_SetProgressionCallback регистрируются процедуры, отвечающие за отображения текущего прогресса обработки файла и общего прогресса архивирования. Символ @ перед именем процедуры необходим для получения указателя на процедуру, соответствующего ее первому байту кода. После чего следует главный цикл программы, код которого расположен между операторами Repeat и Until. Работа цикла прервется при закрытии окна. В цикле определяется текущее событие и если произошел клик по гаджету, (событие #PB_Event_Gadget) производится идентификация гаждета, по которому кликнули и выполнение соответствующего кода. При клике по кнопке с идентификатором #Button_Archive (с надписью "Создать архив") считываются данные со строковых полей (хранящих пути в папке и файлу) в строковые переменные с именами String1 и String2, а затем, проверяется чтобы в переменных были данные. Затем, устанавливается пароль архива при помощи функции PureZIP_SetArchivePassword. После чего вызывается процедура Button_Archive, от кода которой будут зависеть дальнейшее поведение программы. В данной версии программы, в этой процедуре находится только код, отображающий небольшое окно с сообщением что "Функция не реализована". Теперь давайте немного изменим код процедуры Button_Archive, таким образом, чтобы программа могла создать архив из файлов выбранной папки. Замените эту процедуру вот такой: Code Procedure Button_Archive(Directory.s, File.s) If PureZIP_AddFiles(File, Directory+"*.*", #PureZIP_StorePathRelative, #PureZIP_Recursive) <> 0 MessageRequester("", "Архив успешно создан", 64) Else MessageRequester("", "Произошла ошибка при создании архива", 16) EndIf EndProcedure Упаковывает файлы в архив, функция PureZIP_AddFiles. Ее первый аргумент - полный путь к создаваемому архиву в месте с его именем и расширением. Во втором аргументе, указан путь к папке с файлами, которые нужно упаковать в архиве. "*.*" - маска упаковки. В данном случае, будут упакованы все файлы, но при необходимости, можно задать расширение файлов, которые требуется упаковать, а остальные пропустить .Флаг #PureZIP_StorePathRelative означает что при упаковке, в архиве будет сохранен путь к файлам, относительно папки упаковки. Флаг #PureZIP_Recursive указывает упаковать не только содержимое выбранной папки, но и все имеющиеся подпапки. Учтите, данная функция не заменяет файлы в существующем архиве, а создает новые! Теперь программа может создать ZIP архив (в т. ч. и защищенный паролем) из выбранной папки с файлами. А теперь программно распакуем ZIP архив. Для этого немного модифицируем процедуру Button_Archive и заменим ею уже имеющуюся в программе. Code Procedure Button_Archive(Directory.s, File.s) If PureZIP_ExtractFiles(File, "*.*", Directory, #True) <> 0 MessageRequester("", "Архив успешно распакован", 64) Else MessageRequester("", "Произошла ошибка при открытии архива", 16) EndIf EndProcedure За извлечение файлов из архива, отвечает функция PureZIP_ExtractFiles. В ее первом аргументе, указывается путь к распаковываемому архиву. Второй аргумент, задает маску распаковки, а данном случае - все файлы. Третий аргумент - папка, куда будут распакованы файлы. Ну и четвертый аргумент, указывает что при распаковке будет учитываться относительный путь, заданный при упаковке. Скачать файлы, прилагаемые к статье. -------------------------------------------------------------- Продолжение статьи - Создание самораспаковывающегося ZIP архива.
Сообщение отредактировал PBPROG - Вторник, 15 Марта 2011, 00:55 |
|
| |
Stage | Дата: Вторник, 15 Марта 2011, 02:50 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| Создали велосипед, теперь прикручиваем колеса, окей. Какой профит с очередного императивного языка(своя реализация бейсика лол) для которого нужно создавать over 9000 библиотек? VB.NET по религиозным соображениям не юзаете, не purebasic-way? Фанбои, такие фанбои.
|
|
| |
PBPROG | Дата: Вторник, 15 Марта 2011, 10:32 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| PureBasic не требует .NET Framework Библиотека после установки, интегрируется со средой и ее код добавляется в исполняемый файл при компиляции. В итоге программе состоит из одного исполняемого файле не требующего runtime или .NET. Кроме того, программа на PureBasic будет работать быстрее и требовать меньше ресурсов чем аналогичная на VB.NET, но при этом сложность создания программы не увеличится. PS. Что-то не могу найти пример самораспаковывающегося архива на VB.NET - гугл молчит. Может это не возможно из-за особенности технологии .NET? А на PureBasic, ссылка на пример выше. И кроме того, программы на PureBasic без установки дополнительных компонентов запускаются даже на древних компах, с Windows 98, а прогу на VB.NET на них не запустишь!
Сообщение отредактировал PBPROG - Вторник, 15 Марта 2011, 10:38 |
|
| |
Stage | Дата: Среда, 16 Марта 2011, 03:07 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Все ваши доводы к скорости исполнения? Ок, если я хочу нативный бинарник под win почему бы не взять VB6? Если я хочу быстро набыдлокодить, почему бы мне не выбрать VB.NET c огромным количеством библиотек и развитым коммьюнити? Какой смысл форсировать свою реализацию устаревшего бейсика? В энтерпрайзе он нафиг не сдался, 4fun выберут C/C++, да даже ассемблер бодрей выглядит Quote Что-то не могу найти пример самораспаковывающегося архива на VB.NET - гугл молчит. Может это не возможно из-за особенности технологии .NET? Ну я знаю 4 библиотеки для работы с zip под дотнет. Ну а самораспаковывающегося архива пацанам то конечно не видать, проектировщики платформы не продумали, ога.
|
|
| |
PBPROG | Дата: Среда, 16 Марта 2011, 12:11 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Quote (Stage) если я хочу нативный бинарник под win почему бы не взять VB6? Во первых, VB6 уступает в несколько раз, в скорости работы исполняемого файла. Во вторых, в юзая VB6 придется ручками объявлять WinAPI функции, а в PureBasic они уже объявлены. В третих, VB6 только для винды, и если захочится перенести код на Linux или MacOS X, то VB6 тут не помощник (мелкософт не поддерживает другие платформы), а вот PureBasic позволит создать проги для выше перечисленных платформ. И к тому же, PureBasic в отличие от VB6, не использует runtime библиотеку. Quote (Stage) Если я хочу быстро набыдлокодить, почему бы мне не выбрать VB.NET c огромным количеством библиотек и развитым коммьюнити? Уж поверьте, у PureBasic возможностей и библиотек не меньше! Но он позволяет создавать нативные проги даже для Win95 что VB.NET с его .NET даже и не снится! Quote (Stage) Какой смысл форсировать свою реализацию устаревшего бейсика С чего вы взяли что он устаревший? PureBasic постоянно развивается и текущий релиз 4.51 был в сентябре 2010 года. Сначала ознакомтесь с сабжем, прежде чем писать такой бред.
|
|
| |
Stage | Дата: Среда, 16 Марта 2011, 18:46 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| Итак, посмотрел про это чудо чуть подробней. Оказалось, что это надстройка над FASM Тобишь весь код с пурбейсика переводится сначала в ассемблер, а потом передается компилятору fasm. Как вам после этого в голову пришло сравнивать скорость исполнения чистого ассемблера с vb6/vb.net? Quote С чего вы взяли что он устаревший? PureBasic постоянно развивается и текущий релиз 4.51 был в сентябре 2010 года. Я говорил не про "компилятор" пурбейсика, а про сам язык. Quote Уж поверьте, у PureBasic возможностей и библиотек не меньше! Но он позволяет создавать нативные проги даже для Win95 что VB.NET с его .NET даже и не снится! Ваш язык процедурный, так? Возможностей то конечно не меньше, чем в любом императивном языке, но вот профит с этого не совсем понятен. Что мешает выбрать fasm напрямую и зафигачить там свои дзен-коды? Про Win95 очень порадовали, кстати
Сообщение отредактировал Stage - Среда, 16 Марта 2011, 19:02 |
|
| |
PBPROG | Дата: Среда, 16 Марта 2011, 20:25 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Quote (Stage) Как вам после этого в голову пришло сравнивать скорость исполнения чистого ассемблера с vb6/vb.net? Вы предлагаете использовать vb6/vb.net. Так? Вот и сравнил их скорости с PureBasic. Quote (Stage) Я говорил не про "компилятор" пурбейсика, а про сам язык. Как вы определяете что язык устаревший? Если по времени его создания, то в этом случае, паскаль и Си тоже устаревшие, а ассемблер давно пора списать по выслуге лет, но по факту ведь это не так? Так как же вы определили что язык устарел? По каким критериям? Quote (Stage) Ваш язык процедурный, так? Так-то оно так, но если нужно, можно писать в ООП стиле, посредством интерфейсов. Quote (Stage) Что мешает выбрать fasm напрямую То, что разработать программу на PureBasic во много раз проще чем на фасме и она к тому же будет кроссплатформенная чего сложно достичь, кодя на ассемблере. Quote (Stage) Про Win95 очень порадовали, кстати Это всего лишь пример.
|
|
| |
Stage | Дата: Суббота, 19 Марта 2011, 00:09 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Quote Вы предлагаете использовать vb6/vb.net. Так? Вот и сравнил их скорости с PureBasic. Ну какбы надо было уточнить с самого начала, что это не самостоятельный компилятор, а надстройка с синтаксисом бейсика. А то разошлись тут с фреймворками и win95. Quote Как вы определяете что язык устаревший? Если по времени его создания, то в этом случае, паскаль и Си тоже устаревшие, а ассемблер давно пора списать по выслуге лет, но по факту ведь это не так? Дети алгола устарели и это факт. Ассемблер для дзенствующих олдфагов, Си как высокоуровневый ассемблер еще жив, Паскаль как язык вобще не нужен. Quote То, что разработать программу на PureBasic во много раз проще чем на фасме и она к тому же будет кроссплатформенная чего сложно достичь, кодя на ассемблере. А что если появится нужда заюзать системное api, не описанное в макросах пурбейсика? Такие вы адепты однако. Стелите на форумах заученную телегу про скорость/кроссплатформенность/next-gen, на деле же все что мы имеем - это удобный транслятор. Может быть полезен, когда есть необходимость быстро накатать native программу без лишнего мусора. Все.
Сообщение отредактировал Stage - Суббота, 19 Марта 2011, 00:44 |
|
| |
PBPROG | Дата: Суббота, 19 Марта 2011, 00:33 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| Quote (Stage) Ну какбы надо было уточнить с самого начала, что это не самостоятельный компилятор, а надстройка с синтаксисом бейсика. Это не имеет значения. FASM всего лишь промежуточное звено в компиляции программы. Quote (Stage) Паскаль как язык вобще не нужен. Под паскалем можно подразумевать так же дельфи. Quote (Stage) Будет кроссплатформенным исходный код, а не сама программа. Разве я что-то писал про кроссплатформенность исполняемых файлов? Ежу понятно что в данном случае она существует на уровне исходного текста. Quote (Stage) А что если появится нужда заюзать системное api, не описанное в макросах пурбейсика? Если действительно понадобится кроссплатформенность программы, юзающей системные API, то обычно используют условную компиляцию. Здесь подробнее это этом http://pure-basic.narod.ru/docs/MultiOS.html Quote (Stage) Может быть полезен, когда есть необходимость быстро накатать native программу без лишнего мусора. По вашему это редко бывает?
Сообщение отредактировал PBPROG - Суббота, 19 Марта 2011, 00:33 |
|
| |
Stage | Дата: Суббота, 19 Марта 2011, 00:48 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Quote Это не имеет значения. FASM всего лишь промежуточное звено в компиляции программы. А помойму имеет. У вас транслятор же. Quote Под паскалем можно подразумевать так же дельфи. Дельфи туда же. Quote Разве я что-то писал про кроссплатформенность исполняемых файлов? Ежу понятно что в данном случае она существует на уровне исходного текста. Нет, это я написал не поглядев. Quote Если действительно понадобится кроссплатформенность программы, юзающей системные API, то обычно используют условную компиляцию. Препроцессор есть - уже хорошо. Quote По вашему это редко бывает? На сегодняшний день - очень.
|
|
| |
|