Четверг, 29.09.2022, 22:42
PureBasic - кроссплатформенный язык программирования
Главная Форум Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории раздела
Начинающим [8]
Статьи
[16.06.2011][Начинающим]
Как быстро найти описание функции или оператора. (0)
[11.06.2011][Начинающим]
Создание EXE программы. (3)
[24.03.2011][Начинающим]
Работа с отладчиком (0)
[17.03.2011][Начинающим]
Замена значка в исполняемом файле (2)
[15.03.2011][Начинающим]
Перезагрузка процедур. (0)
[09.03.2011][Начинающим]
Создание самораспаковывающегося ZIP архива (0)
[24.02.2011][Начинающим]
Работа с ZIP архивами (0)
[22.02.2011][Начинающим]
Определение IP адреса компьютера (0)
Файлы
[28.06.2011][Примеры]
Примеры программ. (1)
[27.06.2011][PB 4.50 и 4.51]
PortLib - работа с портами компьютера (2)
[10.04.2011][PB 4.50 и 4.51]
PureSMTP - отправка почты (2)
[10.03.2011][Примеры]
3D демки. (1)
[10.03.2011][Примеры]
2D демка. (0)
[09.03.2011][PB 4.50 и 4.51]
Русская справка (0)
[09.03.2011][PB 4.50 и 4.51]
Русификатор PureBasic (1)
[02.03.2011][PB 4.50 и 4.51]
HID_Lib - работа с USB HID устройствами. (9)
[01.03.2011][Примеры]
CodeArchiv_v4-Beta (0)
[28.02.2011][Учебники]
Установка PureBasic на ОС Linux (0)
 Каталог статей
Главная » Статьи » Учебные материалы » Начинающим

Работа с ZIP архивами

Для уменьшения размера файлов, их обычно сжимают - архивируют. Существует много типов архивов, но сейчас мы поговорим о ZIP архивах.

Для работы с ZIP архивами, нужно скачать и установить библиотеку PureZIP

Теперь создадим простейшую программу, упаковывающую один файл в архив.


; Создаем архив с именем 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 не будет обнаружен. В этом случае, нужно указать правильный путь или выбрать другой файл для архивирования.


Теперь создадим заготовку для программы архивирования и распаковки множества файлов и папок. 


Код:

;- 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
 
Procedure
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, таким образом, чтобы программа могла создать архив из файлов выбранной папки. Замените эту процедуру вот такой:

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 и заменим ею уже имеющуюся в программе.


Procedure Button_Archive(Directory.s, File.s)
 If PureZIP_ExtractFiles(File, "*.*", Directory, #True) <> 0
 
  MessageRequester("", "Архив успешно распакован", 64)
 Else
 
  MessageRequester("", "Произошла ошибка при открытии архива", 16)
 EndIf
EndProcedure



За извлечение файлов из архива, отвечает функция PureZIP_ExtractFiles. В ее первом аргументе, указывается путь к распаковываемому архиву. Второй аргумент, задает маску распаковки, а данном случае - все файлы. Третий аргумент - папка, куда будут распакованы файлы. Ну и четвертый аргумент, указывает что при распаковке будет учитываться относительный путь, заданный при упаковке.

Скриншот программы распаковки.

Скачать файлы
Категория: Начинающим | Добавил: fils (24.02.2011)
Просмотров: 10615 | Теги: PureZIP, ZIP, Архив, PureBasic | Рейтинг: 3.7/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2022
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Разработчики PureBasic
  • Русский сайт о PureBasic
  • pure-basic.narod.ru
  • mirashic.narod.ru
  • purebasic.ucoz.com
  • purebasic.org
  • purebasic.ru
  • Копировать материалы сайта без разрешения автора, ЗАПРЕЩЕНО!

    Сделать бесплатный сайт с uCoz