我正在尝试从Java程序中弹出Mac上的USB拇指驱动器。我试过umount和diskutil弹出,但都不起作用。我从两者得到退出代码1。如果我物理地拔出驱动器,Mac OS X会给我标准警告。
我的代码:
log.debug( "going to eject targetRoot.getPath()=" + targetRoot.getPath() );
String command = "diskutil eject " + targetRoot.getPath().replace( " ", "\\ " );
log.debug( "about to run command=" + command );
int exitCode = Runtime.getRuntime().exec( command ).waitFor();
log.debug( "exitCode=" + exitCode );
输出:
going to eject targetRoot.getPath()=/Volumes/NO NAME
about to run command=diskutil eject /Volumes/NO\ NAME
exitCode=1
手册页表明您可以使用已安装的路径或设备的路径作为umount或diskutil弹出的参数。
如果我将命令复制到终端并运行它,那么它可以正常工作。我怀疑这是与环境有关的东西,但是你可以看到我没有向exec方法发送envp。
程序员必须做什么才能使弹出/卸载工作?
谢谢!
答案 0 :(得分:1)
您是否尝试过使用ProcessBuilder而不是Runtime.exec()?它允许您精确地指定每个参数,并且还允许您构建环境。
...或至少使用Runtime.exec()的形式指定参数数组而不是字符串。
我猜你的空间转义不起作用 - Runtime.exec()的便利形式使用StringTokenizer处理空格,可能不像大多数shell那样聪明。