Что нового

uZip автономный модуль для работы с Zip архивами

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
AutoIt: 3+
Версия: 2.33

Категория: Вспомогательные функции, Разное

Описание: uZip автономный модуль для работы с Zip архивами. Умеет ставить пароль на архив, извлекать файл из архива как на диск так и в память, устанавливать уровень компрессии архива, удалять, переименовывать файлы внутри архива и т.д.

Код/Пример:
Код:
#include <uZip.au3>

Global $sPackage = @ScriptDir & '\test.zip' ;~ Имя архива.
Global $sPassword = '' ;~ Пароль на архив. (если пусто, то пароль не ставится.)

If _uZip_Startup() Then

	;~ Функция обратного вызова для отслеживания процесса добавления и извлечения файлов из архива.
    $tCallback = DllCallbackRegister('ProgressCallback', 'uint', 'str;float;int')
	_uZip_AddProgressCallback(DllCallbackGetPtr($tCallback)) ;~ Прогресс добавления файлов в архив.
    _uZip_ExtractProgressCallback(DllCallbackGetPtr($tCallback)) ;~ Прогресс извлечения файлов из архива.

    ;~ Создаём архив.
	If _uZip_Create($sPackage, $sPassword) Then
		;~ Добавляем файлы в созданный архив.
		_uZip_AddFile($sPackage, @WindowsDir & '\Notepad.exe')
		_uZip_AddFile($sPackage, @WindowsDir & '\explorer.exe')

		MsgBox(0, 'uZip', 'Version: ' & _uZip_GetVersion()) ;~ Версия uZip модуля.

		;~ Загружаем файл из ахива в память и получаем указатель на область памяти.
		$pMem = _uZip_LoadToMemory($sPackage, 'Notepad.exe', $sPassword)
		;~ Узнаём MD5 и SHA1 контрольные суммы файла.
		MsgBox(0, 'uZip', 'Notepad.exe' & @CRLF & 'MD5 Checksum:   ' & _uZip_GetFileMD5($pMem) & @CRLF & 'SHA1 Checksum: ' & _uZip_GetFileSHA1($pMem))
		;~ Узнаём размер области памяти (данных загруженных в память).
		MsgBox(0, 'uZip', 'Memory size: ' & _uZip_SizeMemory($pMem))
		;~ Освобождаем память.
		_uZip_CloseMemory($pMem)

        ;~ Узанём Index файла по его имени в архиве.
		$Index = _uZip_GetFileIndex($sPackage, 'Notepad.exe')
		;~ Загружаем информацию о файле.
		If _uZip_GetFileInfo($sPackage, $Index) Then
			MsgBox(0, 'GetFileInfo', 'Compressed size: ' & @TAB & @TAB & _uZip_GetCompressedSize() & @CRLF & _
			                         'Compression method: ' & @TAB & _uZip_GetCompressionMethod() & @CRLF & _
									 'CRC32: ' & @TAB & @TAB & @TAB & _uZip_GetCrc32() & @CRLF & _
									 'External file attributes: ' & @TAB & _uZip_GetExternalFileAttributes() & @CRLF & _
									 'File name: ' & @TAB & @TAB & _uZip_GetFileName() & @CRLF & _
									 'IsPassword: ' & @TAB & @TAB & _uZip_GetFlag() & @CRLF & _
									 'Internal file attributes: ' & @TAB & _uZip_GetInternalFileAttributes() & @CRLF & _
									 'Size file name: ' & @TAB & @TAB & _uZip_GetSizeFileName() & @CRLF & _
									 'File date: ' & @TAB & @TAB & _uZip_GetFileDate() & @CRLF & _
									 'Uncompressed size: ' & @TAB & _uZip_GetUnCompressedSize() & @CRLF & _
									 'Version needed: ' & @TAB & @TAB & _uZip_GetVersionNeeded())
		EndIf
		;~ Загружаем файл в память (в отличии от _uZip_LoadToMemory функция _uZip_LoadToMemoryEx возвращяет не указатель а данные.)
		FileWrite('Test.exe', _uZip_LoadToMemoryEx($sPackage, 'Notepad.exe', $sPassword))
	    ;~ Извлекаем файл из архива на диск.
		;_uZip_SaveToFile($sPackage, 'Notepad.exe', $sPassword, @ScriptDir)
		;~ Удаляем файл из архива.
		_uZip_DeleteFile($sPackage, 'Notepad.exe')
	EndIf
	DllCallbackFree($tCallback)
	_uZip_Shutdown()
EndIf

Func ProgressCallback($sFileName, $fProgress, $lUserParam)
	ConsoleWrite($sFileName & '  ' & StringFormat('%0.1f', $fProgress) & '%' & @CRLF)
EndFunc

Файл: uZip

Снимок: None.

Список доступных функций:
_uZip_Startup
_uZip_Shutdown
_uZip_Create
_uZip_AddFile
_uZip_DeleteFile
_uZip_RenameFile
_uZip_AddMemory
_uZip_LoadToMemory
_uZip_LoadToMemoryEx
_uZip_SaveToFile
_uZip_SaveFromMemory
_uZip_GetFileMD5
_uZip_GetFileSHA1
_uZip_SizeMemory
_uZip_CloseMemory
_uZip_GetFileCount
_uZip_GetVersion
_uZip_GetFileIndex
_uZip_GetFileInfo
_uZip_GetCompressedSize
_uZip_GetCompressionMethod
_uZip_GetCrc32
_uZip_GetExternalFileAttributes
_uZip_GetFileName
_uZip_GetFlag
_uZip_GetInternalFileAttributes
_uZip_GetSizeFileName
_uZip_GetFileDate
_uZip_GetUnCompressedSize
_uZip_GetVersionNeeded
_uZip_AddProgressCallback
_uZip_ExtractProgressCallback

Примечания:
Функции:

_uZip_DeleteFile()
_uZip_RenameFile()

Использовать только если архив не под паролем.

История версий:
2.33

Источник: autoit-script.ru
Автор(ы): Viktor1703, Afonichev Sergey
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
У меня возникла потребность извлечь все файлы находящиеся в архиве с таким-же названием, включая папки и под-папки. Как это сделать с вашей библиотекой?
 

ZloePelme666ko

Новичок
Сообщения
18
Репутация
1
Viktor1703 у меня возникли трудности с функцией чтения файла в переменную, которая мне для задачи нужна как воздух, и ваша UDF единственная в которой нашел как это делать :'(

Когда я перебираю цикл вот так:
Код:
#include <uZip.au3>

Global $sPackage = @ScriptDir & '\KM_2000140_2013_09.zip' ;~ Имя архива.
_uZip_Startup()

$Index=0
While 1
	If _uZip_GetFileInfo($sPackage, $Index) Then ;в качестве теста получаю информацию
		$name = _uZip_GetFileName()
		$size = _uZip_GetUnCompressedSize()
		MsgBox(0,'GetFileInfo', 'Compressed size: ' & @TAB & @TAB & _uZip_GetCompressedSize() & @CRLF & _
		         'Compression method: ' & @TAB & _uZip_GetCompressionMethod() & @CRLF & _
		         'CRC32: ' & @TAB & @TAB & @TAB & _uZip_GetCrc32() & @CRLF & _
		         'External file attributes: ' & @TAB & _uZip_GetExternalFileAttributes() & @CRLF & _
		         'File name: ' & @TAB & @TAB & $name & @CRLF & _
		         'IsPassword: ' & @TAB & @TAB & _uZip_GetFlag() & @CRLF & _
		         'Internal file attributes: ' & @TAB & _uZip_GetInternalFileAttributes() & @CRLF & _
		         'Size file name: ' & @TAB & @TAB & _uZip_GetSizeFileName() & @CRLF & _
		         'File date: ' & @TAB & @TAB & _uZip_GetFileDate() & @CRLF & _
		         'Uncompressed size: ' & @TAB & $size & @CRLF & _
		         'Version needed: ' & @TAB & @TAB & _uZip_GetVersionNeeded())
	Else
		ExitLoop
	EndIf
	FileDelete($name); удаляем если уже существовал
	$data = _uZip_LoadToMemoryEx($sPackage, $name)
	FileWrite($name,$data)
	$index+=1
WEnd

У меня в переменную в первом цикле уходит файл, а в последующих только забитый нулями бинарник. Подскажите, может я что то делаю не так? :idiot:

Даже создал отдельную тему: http://autoit-script.ru/index.php/topic,15223.msg95252/topicseen.html
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Извлекает все файлы, папки и под-папки из архива

Код:
#include <uZip.au3>

Global $Index = 0, $sPackage = @ScriptDir & '\you_archive.zip'

_uZip_Startup()

While 1
	If _uZip_GetFileInfo($sPackage, $Index) Then
		_uZip_SaveToFile($sPackage, _uZip_GetFileName())
	    $Index += 1
	Else
		ExitLoop
	EndIf
WEnd

_uZip_Shutdown()
 

ZloePelme666ko

Новичок
Сообщения
18
Репутация
1
Viktor1703
ну так задачка то в том что бы получать содержимое файла именно сразу в переменную, потом проводить над этим содержимым некоторые операции
 

trizorka

Новичок
Сообщения
53
Репутация
4
Как добавить целую папку с вложенными в ней файлами и подпапками?
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Доброго времени суток, а как отобразить в прогресс баре распаковку архива, использование функции _uZip_ExtractProgressCallback ни к чему не приводят. ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
La2Angel
примерно так
Код:
#include <uZip.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sPackage = @ScriptDir & '\test.zip'
$Form1 = GUICreate("Form1", 576, 101, 192, 124)
Global $Progress1 = GUICtrlCreateProgress(24, 40, 526, 17)
GUISetState(@SW_SHOW)
_Proc()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func _Proc()
If _uZip_Startup() Then
    $tCallback = DllCallbackRegister('ProgressCallback', 'uint', 'str;float;int')
	_uZip_AddProgressCallback(DllCallbackGetPtr($tCallback))
	If _uZip_Create($sPackage,'',0) Then _uZip_AddFile($sPackage,'C:\Downloads\1.mkv')
	DllCallbackFree($tCallback)
	_uZip_Shutdown()
EndIf
EndFunc

Func ProgressCallback($sFileName, $fProgress, $lUserParam)
	GUICtrlSetData($Progress1,$fProgress)
EndFunc
только окно виснет напрочь
 

La2Angel

Новичок
Сообщения
156
Репутация
1
joiner сказал(а):
La2Angel
примерно так
Код:
#include <uZip.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $sPackage = @ScriptDir & '\test.zip'
$Form1 = GUICreate("Form1", 576, 101, 192, 124)
Global $Progress1 = GUICtrlCreateProgress(24, 40, 526, 17)
GUISetState(@SW_SHOW)
_Proc()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func _Proc()
If _uZip_Startup() Then
    $tCallback = DllCallbackRegister('ProgressCallback', 'uint', 'str;float;int')
	_uZip_AddProgressCallback(DllCallbackGetPtr($tCallback))
	If _uZip_Create($sPackage,'',0) Then _uZip_AddFile($sPackage,'C:\Downloads\1.mkv')
	DllCallbackFree($tCallback)
	_uZip_Shutdown()
EndIf
EndFunc

Func ProgressCallback($sFileName, $fProgress, $lUserParam)
	GUICtrlSetData($Progress1,$fProgress)
EndFunc
только окно виснет напрочь

Я так понимаю, это добавление в архив, а я имел ввиду разархивировать с прогресс баром.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
первый прогресс это добавление
второй это извлечение
Код:
#include <uZip.au3>
#include <GUIConstantsEx.au3>

$Form1 = GUICreate("Form1", 459, 113, 192, 124)
Global $Progress1 = GUICtrlCreateProgress(40, 32, 374, 17)
GUISetState(@SW_SHOW)
_Proc()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Func _Proc()
	If _uZip_Startup() Then
		Local $sPackage = @ScriptDir & '\test.zip'
;~ Функция обратного вызова для отслеживания процесса добавления и извлечения файлов из архива.
		$tCallback = DllCallbackRegister('ProgressCallback', 'uint', 'str;float;int')
		_uZip_AddProgressCallback(DllCallbackGetPtr($tCallback)) ;~ Прогресс добавления файлов в архив.
		_uZip_ExtractProgressCallback(DllCallbackGetPtr($tCallback)) ;~ Прогресс извлечения файлов из архива.

;~ Создаём архив.
		If _uZip_Create($sPackage) Then _uZip_AddFile($sPackage, 'C:\1.mp3')
;~ Извлекаем файл из архива на диск.
GUICtrlSetData($Progress1,0)
		_uZip_SaveToFile($sPackage, '1.mp3')
		DllCallbackFree($tCallback)
		_uZip_Shutdown()
	EndIf
EndFunc   ;==>_Proc

Func ProgressCallback($sFileName, $fProgress, $lUserParam)
	GUICtrlSetData($Progress1, $fProgress)
EndFunc   ;==>ProgressCallback
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Заметил тут ошибку, при распаковке архива от 1000 файлов и структурой папок, распаковывает файлов меньше, чем там есть. Возможно и меньший архив так же распаковывает, не тестировал.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
La2Angel
можно увидеть весь скрипт?
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Viktor1703 сказал(а):
Извлекает все файлы, папки и под-папки из архива

Код:
#include <uZip.au3>

Global $Index = 0, $sPackage = @ScriptDir & '\you_archive.zip'

_uZip_Startup()

While 1
	If _uZip_GetFileInfo($sPackage, $Index) Then
		_uZip_SaveToFile($sPackage, _uZip_GetFileName())
	    $Index += 1
	Else
		ExitLoop
	EndIf
WEnd

_uZip_Shutdown()

Вот, воспользовался даже этим, уже часть не распаковывает.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
La2Angel
используй 7Zip.au3
с ним проблем не было. http://autoit-script.ru/index.php?topic=18264.msg110571#msg110571
 

La2Angel

Новичок
Сообщения
156
Репутация
1
joiner сказал(а):
La2Angel
используй 7Zip.au3
с ним проблем не было. http://autoit-script.ru/index.php?topic=18264.msg110571#msg110571

Пробовал, стандартный пример тупит на x64 системе, а то, что получается, вообще не открывается. Пишет мол надо х32 систему:smile:

Если найдете и исправите ошибки, буду рад, а пока я уже на самом Autoit написал упаковщик через FileInstall. Пока хватает.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
La2Angel [?]
стандартный пример тупит на x64 системе
какой пример? по 7z из русской справки?. по ссылке я дал пример, который написал в х64 системе. все работает.
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Я вам врать не буду, буду свободен, скину скриншоты. А сейчас вообще даже не создает, открывает окно создания, выбираю папку, выбираю максимально, жду старт и все, просто закрывается окно без действий.
 

belotooth

Новичок
Сообщения
7
Репутация
0
Неплохо было бы еще добавить возможность извлечения в файл/память по индексу файла, а не только по его имени.
И еще аналоги функций _Zip_List и _Zip_ListAll из модуля _Zip.au3
 

kristow13

Новичок
Сообщения
76
Репутация
0
Подскажите, а как используя uZIP.au3 библиотеку архивировать папку целиком?
В перечне команд такую не нашел...
 
Верх