1

我对 PAR::Packer 还很陌生,而且我已经用 Perl 编写了一个脚本。

我遇到的问题是,当我将其编译为 .exe 并包含两个文件(因此它是可移植的)时,EXE 文件出现“无法打开文件,没有这样的文件或目录”错误

只要C:\temp目录在那里,我就可以轻松地将脚本制作成 .exe 文件并使用它。但我希望它使用包含在 .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"

我该如何解决这个问题?

4

1 回答 1

1

您问题中的代码尝试从目录中打开名为patch1.bin和的两个文件。如果该目录中不存在这些文件,则打开将失败。patch2.binC:/temp

在评论中,您声称如果这些文件与我们的程序捆绑在一起, perl2exe将以某种方式使这些文件出现在该特定目录中。我比较怀疑。根据perl2exe 用户手册,捆绑的文件将被提取到一个目录,其名称由以下给出:

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

根据您的操作系统和设置,这可能是 的子目录C:/temp不能是目录C:/temp本身(因为它必须始终包含p2xtmp路径中的某个位置)。事实上,如果 perl2exe确实将其捆绑文件直接提取到C:/temp. 或任何其他固定目录中,那么如果使用 perl2exe 编译的两个程序同时运行并且具有相同名称的捆绑文件,那将是灾难的根源。

无论如何,正如我链接到的页面所建议的那样,在 PAR 下访问捆绑文件的推荐方法是使用PAR::read_file(). 例如,如果您patch1.bin的 PAR 捆绑包中包含一个文件名pp -a,您可以使用以下命令读取其内容:

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

如果您需要对捆绑文件进行更高级的访问,您可以使用以下方法获取指向整个 PAR 文件的Archive::Zip对象:

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

然后使用它直接访问存档成员。

于 2013-11-29T00:05:36.450 回答