2013-11-28 3 views
1

Я довольно новичок в PAR :: Packer и у меня есть скрипт в perl.PAR :: Проблема упаковщика с включенными файлами

Проблемы я имею, когда я скомпилировать его в .exe и включаю в себя два файла (так его портативным) ошибки еха из с «не могу не открыть файл, нет такого файла или каталога»

я могу легко сделать сценарий в .exe и использовать его, пока существует каталог c: \ temp. но то, что я хочу, это использовать файлы, которые были включены в .exe, а не каталог c: \ temp.

здесь является частью сценария в вопросе:

open($patch1, '<', "C:/temp/patch1.bin") or die "cannot open this file: $!"; 
binmode($patch1); 
open($patch2, '<', "C:/temp/patch2.bin") or die "cannot open this file: $!"; 
binmode($patch2); 

и, как я говорю, все, что я хочу, чтобы это сделать, это использовать файлы, которые были включены в EXE-файл, а не файлы из C :/temp. я считаю, что это может быть, как ив закодированы, но ив пытался "./patch1.bin" вместо "C:/temp/patch1.bin"

любая помощь будет очень высоко ценится, как это кажется, что я что-то очень простое отсутствует.

Спасибо и HAPPY благодарения :)

+0

Также я должен добавить весь этот скрипт, открыть файл, искать определенные смещения, затем он пишет $ patch1, а затем ищет другое смещение и записывает $ patch2. это просто простой сценарий поиска и записи. – james28909

+1

В любом случае, короткий ответ: см. Http://search.cpan.org/perldoc?PAR::Tutorial#Accessing_packed_files –

+0

im извините, если у меня есть вопрос. но это очень простой базовый скрипт, и perl2exe будет компилировать и включать файлы, и он будет выполнять скрипт и использовать файлы из exe. Я пытаюсь выполнить то же самое, чтобы я мог сделать этот перенос для любого ПК с Windows. но проблема в том, что я не хочу использовать perl2exe, поскольку с помощью .exe у него есть 2-секундная задержка при выходе из CMD-окна. Я стараюсь покончить с этой задержкой в ​​2 секунды. – james28909

ответ

1

код в ваш вопрос пытается открыть два файла, названные patch1.bin и patch2.bin, из каталога C:/temp. Если эти файлы не присутствуют в этом каталоге, сбой будет открыт.

В комментариях вы утверждаете, что perl2exe каким-то образом создаст эти файлы в этом конкретном каталоге, если они были включены в нашу программу. Я довольно сомневаюсь в этом. Согласно perl2exe user manual, в комплекте файлы будут извлечены в каталог, имя которого определяется по формуле:

$temp_dir = ($ENV{TEMP} || $ENV{TMP} || $ENV{WINDIR} || '/tmp') . "/p2xtmp-$$"; 

В зависимости от операционной системы и настроек, эта может быть подкаталогом из C:/temp, но не может будь то каталог C:/temp (поскольку он всегда должен содержать p2xtmp где-то в пути). Действительно, если perl2exe сделал, извлеките его связанные файлы непосредственно в C:/temp или в любой другой фиксированный каталог, который был бы рецептом для бедствия, если бы две программы, скомпилированные с использованием perl2exe, выполнялись одновременно и имели вложенные файлы с тем же именем ,

В любом случае, как предлагает page I linked to, рекомендуемый способ доступа к связанным файлам под PAR использует PAR::read_file(). Например, если у вас имя файла patch1.bin включен в вашем PAR пачке с помощью pp -a, вы можете прочитать его содержимое с помощью:

my $contents = PAR::read_file('patch1.bin'); 

Если вам нужен более продвинутого доступ к сгруппированным файлам, вы можете получить Archive::Zip объект, указывающий на весь файл PAR, используя:

my $zip = PAR::par_handle($0); 

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

+0

спасибо, и вы правы. теперь, когда я помню ... я сделал установщик для этого инструмента, и он был переносимым. он создаст каталог «c: \ temp» и добавит туда файлы исправлений. это то, что я сделал в прошлый раз, чтобы обойти эту же проблему. я должен попытаться понять это больше. огромное спасибо за помощь :) – james28909