如何检查路径中是否存在程序
我正在用scala编写一个程序,它调用:
Runtime.getRuntime().exec( "svn ..." )
我想检查“svn”是否可从命令行获得(即在PATH中可以访问)。我该怎么做?
PS:我的程序设计为在Windows上运行
我正在用scala编写一个程序,它调用:
Runtime.getRuntime().exec( "svn ..." )
我想检查“svn”是否可从命令行获得(即在PATH中可以访问)。我该怎么做?
PS:我的程序设计为在Windows上运行
下面是一个 Java 8 解决方案:
String exec = <executable name>;
boolean existsInPath = Stream.of(System.getenv("PATH").split(Pattern.quote(File.pathSeparator)))
.map(Paths::get)
.anyMatch(path -> Files.exists(path.resolve(exec)));
替换为 以获取完全限定的路径。anyMatch(...)
filter(...).findFirst()
下面是一个跨平台静态方法,用于比较常见的可执行扩展:
import java.io.File;
import java.nio.file.Paths;
import java.util.stream.Stream;
import static java.io.File.pathSeparator;
import static java.nio.file.Files.isExecutable;
import static java.lang.System.getenv;
import static java.util.regex.Pattern.quote;
public static boolean canExecute( final String exe ) {
final var paths = getenv( "PATH" ).split( quote( pathSeparator ) );
return Stream.of( paths ).map( Paths::get ).anyMatch(
path -> {
final var p = path.resolve( exe );
var found = false;
for( final var extension : EXTENSIONS ) {
if( isExecutable( Path.of( p.toString() + extension ) ) ) {
found = true;
break;
}
}
return found;
}
);
}
这应该解决对第一个解决方案的大多数批评。除此之外,迭代PATHEXT
系统环境变量可以避免硬编码扩展,但也有其自身的缺点。
我不是 scala 程序员,但是我会在任何语言中执行类似 '' 的东西,只是为了检查 exec 方法的返回代码(0 或 1)...如果失败,则 svn 不在路径:Psvn help
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("svn help");
int exitVal = proc.exitValue();
按照惯例,值 0 表示正常终止。