1

我想将现有的 .exe 文件从一个目录复制到另一个目录,然后使用 Java 启动它。像这样:

FileIO.copy( new File( sourceFile ), new File( targetFile ) );
System.out.println( "Existing: " + new File( targetFile ).exists() );
System.out.println( "Launching " + targetFile );
String cmd[] = { targetFile };
Process p = Runtime.getRuntime().exec( cmd );
p.waitFor();
System.out.println( "Result: " + p.exitValue() );

输出是这样的:

Existing: true
Launching C:\test\Launcher.new.exe
Result: 2

所以 Java 说该文件是有效的并且存在,但 Windows 只是无法启动该进程,因为它认为该文件不存在。路径是绝对的并带有反斜杠。我还拥有文件​​的所有权限,因此我可以执行它们。Launcher.new.exe 由 Launch4j 生成,因此它或多或少是独立的。至少它不依赖于同一文件夹中的 DLL。但奇怪的是:当我复制并启动 notepad.exe 时它可以工作。

一件更奇怪的事情:如果我不通过 Java 而是手动复制文件,启动也会失败并出现同样的错误。

操作系统是带有 SP1 的 Vista。

有什么线索吗?

4

4 回答 4

0

没有更多细节,很难给出具体答案。检查您对 c:\test 目录的权限以及您尝试执行的目标文件的权限。

于 2010-05-20T15:05:22.017 回答
0

嗯...我想知道这是否是 Vista 出色的用户访问控制在起作用...

您在 Program Files 中工作吗?如果是这样,请将所有内容移到一个单独的文件夹 (c:\CopyTest) 中,然后重试 - 看看是否有帮助...

于 2010-05-20T14:56:44.743 回答
0

如果您的路径包含正斜杠,您可能想在execing 之前尝试将它们更改为反斜杠。此外,您应该尝试使路径成为绝对路径,包括驱动器号和冒号(例如C:\test\myprog.exe)。请注意,如果您在 Java 字符串中编码路径,则需要将反斜杠加倍...

一旦你开始工作,你就可以放松这些限制,直到你弄清楚是什么破坏了你的尝试。


编辑 1:本文exec()中提到了一些常见的陷阱。我认为这些都不适用,但您可能希望使用上一个示例中的编码在其中运行您的 .EXE以获得体面的路径解析、错误处理等。CMD.EXE


编辑 2:您的可执行文件名需要被解释为长文件名。我不肯定 API 可以/将处理这个问题。请尝试为 .EXE 提供一个简短的名称(仅用于测试),例如 NEWPROG.EXE(名称中也没有第二个点!)但首先一定要先尝试使用 CMD.EXE。


编辑3:从阅读评论到另一个答案:您的程序是否可能确实正在运行,并且由于找不到文件而本身返回状态2?是否有某种方法可以验证程序的操作,也许是通过.CMD从 Java 程序运行的批处理脚本中调用它,并将其写入重定向到文件的输出?

于 2010-05-20T15:01:51.223 回答
0

也许您可能面临的问题是目录中没有捆绑更多内容。Launch4j 可能会将您的程序转换为 exe,但 jre 只有一个本地目录。该文件夹包含任何现有 Java jre 的 bin 和 lib 文件。也许它有帮助...

更新 似乎有些人很难理解我所说的话。没问题,我会解释的。

举个例子,我用 Java 创建了一个简单的客户端聊天应用程序,并将它导出到一个可运行的.../ClientChatApp.jar文件中。然而,它仍然没有运行该文件的依赖项,并且需要在桌面上安装 Java 才能执行此操作。例如这里,.../ClientChatApp.jar仍然需要javax.swing.*,java.net.*和的依赖关系java.io.*。因此,它将从它应该使用的 JDK/JRE 中找到这些依赖项。

现在,当涉及从转换为.../ClientChatApp.jar.../ClientChatApp.exe,它将按预期工作,前提是桌面安装了 Java,以便它可以从那里收集依赖项。这对用户不友好,因为任何未安装 Java 的用户都必须先安装它才能使用您的应用程序。

这就是 Launch4j 的帮助所在。当您使用此程序从 jar 转换为 exe 时,它​​有助于重定向 exe 将在本地文件夹中查找依赖项的位置,通常.../jre/...作为文件位于 sam 目录中.../ClientChatApp.exe。快速提示:要真正做到这一点,请转到与您想要拥有 exe 文件的目录相同的目录,在那里创建一个名为jre. 现在转到C:/Program Files/Java/<<your JDK or JRE folder>>/然后选择并复制binlib文件夹并复制它们。然后转到您创建文件夹的目录jre并将两个文件夹粘贴到该文件夹​​中。

许多用户可能已经这样做了,但是为什么我解释以上所有内容是为了清楚地了解该jre文件夹的作用,因此来到要点,您还必须将带有 exe 文件的 jre 文件夹发送到用户,否则执行时会出现故障点。您可以将它们发送到 .zip 文件或使用 Inno Setup 创建安装程序 exe。如果您想使用 Inno Setup,我建议您进行更多研究。

而已。谢谢你!(请支持我,这是我的第一个答案)

于 2021-03-29T04:45:26.847 回答