Пятница, 29 Марта 2024, 01:55

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Basic » Работа с ZIP архивами. (Не большая статья о работе с ZIP архивами в среде PureBasic.)
Работа с 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++, да даже ассемблер бодрей выглядит wink

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 smile Тобишь весь код с пурбейсика переводится сначала в ассемблер, а потом передается компилятору fasm. Как вам после этого в голову пришло сравнивать скорость исполнения чистого ассемблера с vb6/vb.net?

Quote
С чего вы взяли что он устаревший?
PureBasic постоянно развивается и текущий релиз 4.51 был в сентябре 2010 года.

Я говорил не про "компилятор" пурбейсика, а про сам язык.

Quote
Уж поверьте, у PureBasic возможностей и библиотек не меньше! Но он позволяет создавать нативные проги даже для Win95 что VB.NET с его .NET даже и не снится!

Ваш язык процедурный, так? Возможностей то конечно не меньше, чем в любом императивном языке, но вот профит с этого не совсем понятен. Что мешает выбрать fasm напрямую
и зафигачить там свои дзен-коды? Про Win95 очень порадовали, кстати biggrin


Сообщение отредактировал 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
По вашему это редко бывает?

На сегодняшний день - очень.
Форум игроделов » Программирование » Basic » Работа с ZIP архивами. (Не большая статья о работе с ZIP архивами в среде PureBasic.)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг