2013-11-28 3 views
1

저는 PAR :: Packer에 매우 익숙하며 perl에서 스크립트를 wrtten했습니다. 내가 .exe를 위해 컴파일과 함께 exe 인 오류 아웃 "파일을 열 수 없습니다가, 그런 파일이나 디렉토리 수 있습니다"PAR :: Packer에 포함 된 파일 문제가 발생했습니다.

내가 쉽게 만들 수 있습니다 (그래서 포터블) 두 개의 파일을 포함 할 때

난 데 문제는 c : \ temp 디렉토리가있는 한 .exe로 스크립트를 복사하십시오. 하지만 내가 원하는 것은 c : \ temp 디렉토리가 아닌 .exe에 포함 된 파일을 사용하는 것입니다. 여기

문제의 스크립트의 일부입니다

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); 

와 같은 나는 그것을이 원하는 모두는 C에서 .EXE에 포함 된 파일 및 NOT 파일을 사용하고, 말 :/temp 디렉토리. 는 내가 그것을 필자가 코딩하는 방법이 될 수있다라고 생각하지만, 필자는 내가 아주 간단한 뭔가를 놓친 거지 것처럼 보인다 도움은 매우 극명하게 될 것이다 "C:/temp/patch1.bin"

대신 "./patch1.bin"을 시도했다.

감사하고 행복한 추수 감사절 :

질문의 코드 디렉토리 C:/temp에서 patch1.binpatch2.bin라는 이름의이 개 파일을 열려고
+0

또한이 스크립트를 모두 추가해야하고, 파일을 열고, 특정 오프셋을 찾고, $ patch1을 쓴 다음 다른 오프셋을 찾고 $ patch2를 씁니다. 그것의 다만 간단한 찾는과 원본을 쓰십시오. – james28909

+1

어쨌든, 짧은 답변 : http://search.cpan.org/perldoc?PAR::Tutorial#Accessing_packed_files –

+0

을 참조하십시오. 질문이 중복되면 사과드립니다. 하지만 이것은 매우 기본적인 스크립트이고 perl2exe는 파일을 컴파일하고 포함하며 스크립트를 실행하고 exe 내에서 파일을 사용합니다. 나는 똑같은 일을 성취하려고 노력 중이므로 모든 윈도우 PC에서이 휴대용을 만들 수있다. 하지만 문제는 cmd.exe를 종료 할 때 2 초의 지연 시간을 갖는 .exe가 만들어지기 때문에 perl2exe를 사용하고 싶지 않다는 것입니다. 나는이 2 초 지연을 거의 없애려고 노력하고있다. – james28909

답변

1

. 해당 파일이 해당 디렉토리에 없으면 열기가 실패합니다.

의견에 따르면 perl2exe은 프로그램과 함께 번들로 제공된 특정 파일에 해당 파일이 표시되는 것으로 간주합니다. 나는 그것을 의심한다. perl2exe user manual에 따르면, 번들 파일 이름이 주어진다 디렉토리로 추출됩니다

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

당신의 OS 및 설정에 따라이 하위 디렉토리 C:/temp 수 있지만 수 그것은 수 없습니다 디렉토리 C:/temp 자체가되어야합니다 (경로의 어딘가에 항상 p2xtmp이 있어야하므로). 실제로 perl2exe 번들 파일을 C:/temp 또는 다른 고정 디렉토리에 직접 추출한 경우 perl2exe를 사용하여 컴파일 된 두 개의 프로그램이 동시에 실행되어 동일한 이름의 파일이 번들 된 경우 재난에 대한 처방이됩니다 .

어쨌든 page I linked to에서 알 수 있듯이 PAR에서 번들 파일에 액세스하는 권장 방법은 PAR::read_file()입니다. 당신이 pp -a를 사용 patch1.bin 당신의 PAR 번들에 포함 된 파일 이름이 있다면 예를 들어, 사용 내용을 읽을 수 있습니다 : 당신이 번들 파일에 고급 액세스해야하는 경우, 당신이 가리키는 Archive::Zip 개체를 얻을 수 있습니다

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

전체 PAR 파일 사용 :

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

그런 다음이를 사용하여 아카이브 멤버에 직접 액세스하십시오.

+0

감사합니다. 그리고 당신 말이 맞습니다. 이제는 기억합니다 ... 나는이 도구의 설치 프로그램을 만들었고 휴대용이었습니다. "c : \ temp"디렉토리를 만들고 거기에 패치 파일을 추가합니다. 그것이 내가 지난번에 똑같은 문제를 해결하기 위해 한 일입니다. 나는이 더 많은 권자를 이해하려고 노력해야 할 것이다. 도와 주셔서 대단히 감사합니다 :) – james28909