Что нового

AutoItPacker4 - Замена стандартному FileInstall

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Версия AutoIt
3.3.6.1
Версия
4
AutoIt: 3.3.6.1 +
Версия: 4

Категория: Файловая система, Разное

Описание:
UDF для создания архива в любом файле с его последующем извлечением. Имеет возможность шифрования по паролю (RC4) и возможность отображения прогресса выполнения.
Давно собирался написать нечто подобное, несколько раз забрасывал. Почему меня не устраивает стандартная функция FileInstall, так это потому-что нет прогресса выполнения и нет возможности отменить распаковку больших (а точнее любых) файлов.

Открыть ранее созданный AUP4 файл:
_Aup4_Open($sFile[, $sPassword[, $sTempDir]])

Создать пустой AUP4 файл:
_Aup4_Create($sFileName[, $sComment[, $sPassword[, $fReturnHangle]]])

Закрыть ранее открытый AUP4 файл:
_Aup4_Close($hOpen)

Добавить указанный файл в виде пакета в ранее открытый AUP4 файл:
_Aup4_AddFileToPacket($hOpen, $sFile[, $sDescription[, $sProgressFunc]])

Добавить данные в виде пакета в ранее открытый AUP4 файл:
_Aup4_AddDataToPacket($hOpen, $vData[, $sDescription])

Извлечь указанный пакет архива в указанный файл:
_Aup4_PacketGetToFile($hOpen, $iPacket, $sOutFile[, $sProgressFunc])

Вернуть содержимое указанного пакета:
_Aup4_PacketGetData($hOpen, $iPacket)

Получить информацию о всех пакетах указанного AUP4 файла в виде 2D массива:
_Aup4_GetInfo($hOpen)

Возвращает описание для указанного пакета:
_Aup4_GetPacketDescription($hOpen, $iPacket)

Возвращает размер указанного пакета в Байтах:
_Aup4_GetPacketSize($hOpen, $iPacket)

Установить/удалить/изменить комментарий указанного AUP4 файла:
_Aup4_SetComment($hOpen, $sComment[, $sProgressFunc])

Поличить ранее установленный коментарий указанного AUP4 файла:
_Aup4_GetComment($hOpen)

Удалить указанный пакет из указанного AUP4 файла:
_Aup4_PacketDelete($hOpen, $iPacket[, $sProgressFunc])

Разделить указанный файл на 3 части (данные перед заголовком AUP4, сам AUP4, данные после содержимого AUP4) и зваписать в 3 разных файла:
_Aup4_Split($hOpen[, $sBeginFile[, $sAupFile[, $sEndFile[, $sProgressFunc]]]])

Удалить область AUP4 из указанного файла:
_Aup4_Delete($hOpen[, $sProgressFunc])

Склеить AUP4 файл с указанным файлом. AUP4 файл будет расположен в конце указанного:
_Aup4_Glue($sInAupFile, $sOutFile[, $sProgressFunc[, $fReWrite]])

Файл: Прикреплен к посту. Зеркало: *тык*

История версий:
[box title=3.1.0 (03.12.2013)]Первый выпуск UDF[/box]
[box title=3.1.1 (18.12.2013)]
• Ускорена работа распаковки пакетов (при первом извлечении пакета запоминается позиция начала блока информации, при последующих извлечениях скрипт берет позицию из памяти, а не ищет блок информации, перебирая каждый символ файла)
• Добавлена функция _AUP3_GetAsString (получение содержимого пакета в виде текста, без предварительной записи временных файлов)[/box]
[box title=3.2.0 (13.01.2014)]
• UDF снова написана с нуля.
• Добавлена CHM справка
• Добавлены новые функции (всего 15)
Файл: AutoItPacker3.zip[/box]
[box title=4 (02.11.2014)]
• UDF снова написана с нуля.[/box]



Источник: autoit-script.ru
Автор: Astel064
 
Автор
Astel064
Источник
Ссылка на источник

Вложения

  • AutoItPacker4.zip
    401.9 КБ · Просмотры: 7
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Re: AutoItPacker3 - Замена стандартному FileInstall

так понимаю, это запись файлов в один. ну, fileinstall для включения в экзешник программы файлов..как здесь применить включение файлов в исполняемый файл?

Astel064, всякая идея интересна. Поэтому не сочти за критику мое сообщение. Просто интересно :smile:
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: AutoItPacker3 - Замена стандартному FileInstall

joiner [?]
как здесь применить включение файлов в исполняемый файл?

Самый простои вариант:
• Скомпилировать 1 раз Run_After.au3 и поместить его в папку с программой
• В скрипте своей программы указать следующее:
Код:
#AutoIt3Wrapper_Run_After=Run_After.exe "%out%" "Файл 1" "Файл 2"; и т.д..


• Ну а предварительно, там где нужен в скрипте FileInstall, записать на его место:
Код:
_AUP3_Unpack(X, "Конечная папка\Конечный файл", "", "_MyProgress")


где "X" - номер пакета (т.е. первым был добавлен "Файл 1", значит на месте первого пакета будет содержимое файла "Файл 1"), "Конечная папка\Конечный файл" - путь, по которому будет выполнена запись, ну и "_MyProgress" - функция прогресса. Более детально все разъяснено в файле AutoItPacker3.inc



Astel064, всякая идея интересна. Поэтому не сочти за критику мое сообщение. Просто интересно
smiley.gif
Ну что Вы, все хорошо :smile:



Добавлено:
Сообщение автоматически объединено:

joiner [?]
так понимаю, это запись файлов в один

Вы все правильно поняли :smile:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Re: AutoItPacker3 - Замена стандартному FileInstall

Astel064
А я бы использовал на вашем месте _WinAPI_WriteFile / _WinAPI_ReadFile, более надежно, экономично и красиво.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: AutoItPacker3 - Замена стандартному FileInstall

firex [?]
А я бы использовал на вашем месте _WinAPI_WriteFile / _WinAPI_ReadFile, более надежно, экономично и красиво.
Знаю про эти функции, но не дружу с DLL-структурами

madmasles [?]
Про эту UDF знаю, но ее нельзя использовать как мою: я не могу расположить архив сразу после кода EXE.

А можно подробнее, я вроде всю эту тему (когда-то) читал, но сейчас не припоминаю что-либо связанное с FileInstall :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: AutoItPacker3 - Замена стандартному FileInstall

Astel064 [?]
А можно подробнее, я вроде всю эту тему (когда-то) читал, но сейчас не припоминаю что-либо связанное с FileInstall
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_File_Add=7za.exe, DATA, 7Z
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <WinAPIEx.au3>

If Not @Compiled Then Exit 13
Global $hInstance, $tData, $iSize, $hFile, $iBytes

$hInstance = _WinAPI_GetModuleHandle(0)
$tData = _LoadResourceData($hInstance, 'DATA', '7Z')
If @error Then
	Exit 13
Else
	$iSize = @extended
EndIf
$hFile = _WinAPI_CreateFile(@ScriptDir & '\7za.exe', 1)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tData), $iSize, $iBytes)
_WinAPI_CloseHandle($hFile)


Func _LoadResourceData($hInstance, $sResType, $sResName, $iResLanguage = 0)

	Local $hInfo, $hData, $pData, $iSize

	If $iResLanguage Then
		$hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
	Else
		$hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
	EndIf
	$hData = _WinAPI_LoadResource($hInstance, $hInfo)
	$iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
	$pData = _WinAPI_LockResource($hData)
	If @error Then
		Return SetError(1, 0, '')
	EndIf
	Return SetError(0, $iSize, DllStructCreate('byte[' & $iSize & ']', $pData))
EndFunc   ;==>_LoadResourceData
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: AutoItPacker3 - Замена стандартному FileInstall

madmasles
Спасибо за пример, но у меня есть некоторые проблемы:
1) Wrapper добавляет ресурс но не в DATA, 7Z
а RCDATA, 1, 2057. Последняя версия Wrapper'а у меня не работает (т.е. вообще не подает признаков жизни при работе)
2) Пользуясь Вашим способом невозможно отображать прогресс выполния
3) Также, невозможно отменить чтение / запись, если она начата
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: AutoItPacker3 - Замена стандартному FileInstall

Astel064 [?]
1) Wrapper добавляет ресурс но не в DATA, 7Z
а RCDATA, 1, 2057. Последняя версия Wrapper'а у меня не работает (т.е. вообще не подает признаков жизни при работе)
У меня все работает.
2) Пользуясь Вашим способом невозможно отображать прогресс выполния
3) Также, невозможно отменить чтение / запись, если она начата
Это сделать очень просто.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: AutoItPacker3 - Замена стандартному FileInstall

Astel064 сказал(а):
1) Wrapper добавляет ресурс но не в DATA, 7Z
а RCDATA, 1, 2057.

В 3.3.6.1 работает как и задумано.

Astel064 сказал(а):
2) Пользуясь Вашим способом невозможно отображать прогресс выполния
3) Также, невозможно отменить чтение / запись, если она начата

А зачем? Это ведь разовые действия со стороны разработчика. В большинстве случаев подобные операции стараются прописать в директивах AutoIt3Wrapper'а, чтобы они делались автаматом при компиляции скрипта.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: AutoItPacker3 - Замена стандартному FileInstall

Yashied [?]

У меня 3.3.6.1 и нормально ничего не работает :smile:


А зачем? Это ведь разовые действия со стороны разработчика. В большинстве случаев подобные операции стараются прописать в директивах AutoIt3Wrapper'а, чтобы они делались автаматом при компиляции скрипта.
Иногда требуется извлечь файл в 100 МБ и более (например, если Вы хотите написать установщик, или само-распаковщик), если воспользоваться FileInstall, то на время излечения скрипт будет "подвешен", пользователя это может смутить (решит, что программа с ошибками, что так виснет).
В этом заключалось мое желание написать нечто подобное, как AutoItPacker3, но если-бы я мог разобраться со структурами и прочими API функциями, я-бы непременно использовал-бы их, но сейчас нет ни времени ни желания лезть в эти дебри, поэтому, UDF состоит и стандартных функция (FileOpen, FileRead, и т.д..)


Yashied [?]
Согласен, AutoItPacker3 тоже имеет разовое назначение: т.е. однажды созданный архив не предназначен для изменений.
Также, есть одно "упрощение": достаточно 1 раз создать архив, а следом при компиляциях добавлять его в готовый EXE так (с помощью CMD, естественно):
Код:
Type "Архив" >> EXE

Или с помощью Copy Файл + Файл (точно сейчас не помню)
 
Верх