Scala在不同的工作目录上运行进程

时间:2013-09-09 16:27:08

标签: scala process ioexception

我不能使用Process(“dir / e.exe”),因为e需要在自己的目录上执行,否则它无法访问其资源。但每当我尝试更改工作目录时,我都会收到异常:

Process("e.exe", new File(dir)) 
Process("e.exe", new File("\"+ dir))
Process("e.exe", new File(new File(dir).getCanonicalPath()))  

Caused by: java.io.IOException: Cannot run program "e.exe" (in directory ".
\dir"): CreateProcess error=2, The system cannot find the file specified

这些不起作用,它们给我完全相同的错误。还有其他选择吗?

编辑:这就是我的目录:

MyFolder:
|-app.jar
|-folderWithExe
  \-e.exe

3 个答案:

答案 0 :(得分:2)

好的,这就是我所拥有的(脏代码,仅用于演示目的)

首先,我的目录结构(subdir是一个子目录):

cdshines@v3700:~/test|⇒  ls -R
.:
log  pb.scala  subdir

./subdir:
ls

然后我的代码:

import java.lang.ProcessBuilder
import java.io.File

val pb = new ProcessBuilder("ls", "../")
pb.directory(new File("subdir"))
pb.redirectOutput(ProcessBuilder.Redirect.to(new File("log")))
val p = pb.start
p.waitFor
println(p.exitValue)

让我们看看:

cdshines@v3700:~/test|⇒  scala pb.scala
0
cdshines@v3700:~/test|⇒  cat log
log
pb.scala
subdir

这是您对此代码的期望吗?看起来很好。

一般来说:

1)使用new ProcessBuilder("application", "arg0", "arg1")

创建ProcessBulder

2)按"pb.directory(new File("path/to/dir"))"

设置目录

3)使用ProcessProcessBuilder方法获取输出或退出代码等。

使用Scala,您可以使用Source来使写入更快一些(更脏,但足够好玩):

scala.io.Source.fromInputStream(
  new ProcessBuilder("ls", "../")
  .directory(new File("subdir"))
  .start
  .getInputStream).getLines.mkString("\n")

答案 1 :(得分:1)

尝试“./e.exe”或输入“。”在路上。

(为清晰起见而编辑)。

事后:问题是,如果没有SO,你能做些什么来快速解决这个问题呢?你真的想要一条消息说:“在尝试这些位置后找不到要运行的程序......”或者甚至可能在-Dprocess.debug之下,“有一个名为foo的文件当前目录,但我无法运行它,因为......“

记录:

import sys.process._
import java.io.File

//System setSecurityManager new SecurityManager
Console println Process("./tester", new File("subdir")).lines.toList

显示该路径很重要:

apm@mara:~/tmp/cdtest$ echo $PATH
/home/apm/go1.1/go/bin:/home/apm/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
apm@mara:~/tmp/cdtest$ vi runit.scala
apm@mara:~/tmp/cdtest$ scalam runit.scala
java.io.IOException: Cannot run program "tester" (in directory "subdir"): error=2, No such file or directory
apm@mara:~/tmp/cdtest$ grep tester runit.scala 
Console println Process("tester", new File("subdir")).lines.toList
apm@mara:~/tmp/cdtest$ PATH=$PATH:.
apm@mara:~/tmp/cdtest$ scalam runit.scala
List(file1, file2, tester)

答案 2 :(得分:0)

此代码应解决您的问题

    ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "cd \"D:\\folder\\With\\Exe\" && e.exe");
    Process p = builder.start();
    p.waitFor();