Что нового

Как реализовать FileInstall по выбору (проблема в компиляции)

V

VitAl2013

Гость
Есть
Код:
FileInstall ("include\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm", $way & "\formats\gbl_ml_"&StringLower($list_format)&"_"&StringLower(StringLeft($position, 1))&".frm", 0)

Скрипт, работает, а билд соответсвенно выдаёт ошибку на FileInstall.

Хочу сделать так чтоб программа впитала все файлы, а выплёвывала только необходимые, те что прошли по условию. Может можно как-то впитать дирректорию? Какие ещё способы есть кроме FileInstall ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Как реализовать FileInstall по выбору (проблема в билде)

В справке ведь написано:
The source file must be specified using a string literal and can not be a variable

P.S
«Билд» ещё распознаётся в сленге как версия, поэтому разумнее будет использовать слово «компиляция» ;).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Как реализовать FileInstall по выбору (проблема в билде)

VitAl2013
В русской справке про функции FileInstall() дано подробное описание, в частности:
Замечания
Название исходного файла должно указываться явно в виде текстовой строки, а НЕ переменной
И, по-моему, как Вы выражаетесь, "выплевывать" программа будет все файлы, а дальше их используйте и удаляйте, если они Вам больше не нужны.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Как реализовать FileInstall по выбору (проблема в билде)

VitAl2013 [?]
можно как-то впитать дирректорию?
Вот вспомагательная функция для построения списка FileInstall (дерево папок):

Код:
$sRet_FI_Lines = _FileInstallGetFolder(@ScriptDir, "@TempDir", 0, "*.*")
ConsoleWrite("+Return:" & @CRLF & @CRLF & $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error & @CRLF & @CRLF)

Func _FileInstallGetFolder($sSource, $sDest, $nFlag = 0, $sMask = "*", $nCompiled = False)
	Local $hSearch, $sNext_File, $sRet_FI_Lines = ""
    
	If (Not $nCompiled) Or ($nCompiled And @Compiled) Then
		$hSearch = FileFindFirstFile($sSource & "\" & $sMask)
		If $hSearch = -1 Then Return SetError(1, 0, "")
		
		;Check if it's a $Var (or $Array[$i][N]...)
		Local $iAddAsVar = StringRegExp($sDest, "\A(\$\w+(\[(\$\w+|\d+)\])*?|@\w+)$")
		
		While 1
            $sNext_File = FileFindNextFile($hSearch)
            If @error Then
				ExitLoop ;No more files
			EndIf
			
			If $sSource = @ScriptDir And $sNext_File = @ScriptName Then
				ContinueLoop
			EndIf
			
			If $iAddAsVar Then
				$sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", ' & _
					$sDest & ' & "\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF
			Else
				$sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", "' & _
					$sDest & '\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF
			EndIf
		WEnd
		
		FileClose($hSearch)
    EndIf
	
	If $sRet_FI_Lines = "" Then Return SetError(2, 0, "")
    Return StringStripWS($sRet_FI_Lines, 3)
EndFunc
 
Автор
V

VitAl2013

Гость
CreatoR
Возможно ли применение результата действия этой функции, как команды скрипту?

Я так понимаю что при компиляции в exe всасываются все файлы после "FileInstall(", а вот куда и когда они будут раскрыты это для компилятора не важно. То есть создав нечто вроде FileInstall([путь и и мя файла], @ScriptDir, 0) exe впитает этот файл... А возможно ли его вызов по другому пути? Или так, если у меня в скрипте будет такая кнструкция:
Код:
if $a>0 then
FileInstall([1], @ScriptDir, 0)
FileInstall([2], @ScriptDir, 0)
endif 
if $a = 0 then
FileInstall([1], @ScriptDir, 1)
endif
if $a<5 then
FileInstall([2], @ScriptDir, 1)
endif

Получается у меня внутри скрипта будут два файла №1 и два №2, соответсвенно и размер его будет больше в 2 раза?
Может есть возможность внедрить файл единожды, а развёртывать по разному?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013 [?]
Получается у меня внутри скрипта будут два файла №1 и два №2, соответсвенно и размер его будет больше в 2 раза?
Нет, включается файл только один раз, это конечно при условии что исходные пути совпадают.
 
Автор
V

VitAl2013

Гость
Хорошо, вот мы впитали необходимые файлы. Но теперь получается нельзя из общей кучи вытянуть только те которые необходимы? Тоесть те имя которых не заданы в явном виде. Нельзя в качестве первого элемента FileInstall как-то указать эту кучу файлов и выбрать из них?

Смотрите что нарыл: http://www.autoitscript.com/forum/index.php?showtopic=51103&hl=resources.au3 Как сказал Обама "Yes, you can, baby!" :smoking:
Немного AutoIt3Wrapper и _ResourceSaveToFile творят чудеса. :sorcerer:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013 [?]
теперь получается нельзя из общей кучи вытянуть только те которые необходимы?
Почему нельзя? и вообще, что конкретно ты пытаешься сделать?


Нельзя в качестве первого элемента FileInstall как-то указать эту кучу файлов и выбрать из них?
Нет, но можно автоматизировать построение списка FileInstall'ов для этой кучи :smile:, как я это сделал со списком папок.
 
Автор
V

VitAl2013

Гость
CreatoR
С учётом resources.au3 библиотеки надо, чтоб она формировала строчки типа:
Код:
#AutoIt3Wrapper_Res_File_Add=image3.jpg, rt_rcdata, TEST_JPG_1
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Возможно я не так понял (фразы впитал и выплевала наводят на сомнения ... :D )

Файл упаковываем архиватором RAR, добавляем этот архив в исполняемый файл незабываем модуль Rar.exe с извлечением в папку TEMP.

Потом обращаемся к этому архиву через командную строку ... _RunDos("Команда"), и извлекаем в любую удобную папку. Вместо пути можно использовать переменную которая содержит путь.

Незабываем прочитать справку к WinRar (режим командной строки) ;)
 
Автор
V

VitAl2013

Гость
То есть у нас 2 файла в итоге. скрипт.exe + rar.exe, либо впихиваем rar.exe внутрь скрипт.ехе и потом всё равно его извлекаем весь? Не пойдёт, к томуже логичнее использовать не старенький проприоритарный RAR, а 7z - опенсорс, жмёт лучше. Командная строка тоже есть.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Не зная какие файлы нужно извлечь, какого они размера, как можно Вам помочь :wacko:
CreatoR - какой пост пытается понять что Вам нужно ... я вот тоже не понимаю ничего.
 
Автор
V

VitAl2013

Гость
CreatoR - какой пост пытается понять что Вам нужно
он тоже человек... я надеюсь. :smile:

Тему читаем внимательно и последовательно - я сам уже всё решил. Ничего такого трудного особенно в понимании я не сказал. Этим вопросом задавалось достаточное кол-во человек, чтоб появилась библиотека resources.au3. С помощью неё можно сделать всё о чём я спрашивал. Можно закинуть файлы в exe в любом кол-ве, можно потом выборочно их оттуда извлечь. Расширяем рамки мышления, как говориться, не циклимся на одном FileInstall и его ограниченных воможностях. :ok:

Есть правда проблемка с этой библиотекой пишет про какую-то ошибку в строке 13 указывая так:
Код:
Line 13 (File... resources.au3)
Global Const $RT_CURSOR = 1
Global Const ^ERROR

Error: Can not redeclare a constant.

Но эта строка в том файле 8ая а не 13ая. А вообще была мысль что эта константа где-то уже определяется и он её переопределить не может. Закоментировал, получил почемуто тоже самое

В общем библиотека конфликтует с WinApiEx.au3. У них задаются переменные одинаковые. Решается либо сапрессом, либо както перемиеновывать все переменные в рамках одной библиотеки.
 
Верх