Mac 从 Java 程序中弹出 USB 磁盘

发布于 2024-12-03 22:44:36 字数 801 浏览 0 评论 0原文

我正在尝试从 Java 程序中弹出 Mac 上的 USB 拇指驱动器。我尝试过 umount 和 diskutil pop,但都不起作用。我从两者中得到的退出代码均为 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 弹出的参数。

如果我将命令复制到终端并运行它,那么它就可以完美运行。我怀疑这与环境有关,但正如您所看到的,我没有将 envp 发送到 exec 方法。

程序员需要做什么才能使弹出/卸载工作正常?

谢谢!

I'm trying to eject a USB thumb drive on Mac from a Java program. I've tried umount and diskutil eject and neither works. I get an exit code of 1 from both. If I physically pull the drive out, Mac OS X gives me the standard warning.

My code:

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 );

The output:

going to eject targetRoot.getPath()=/Volumes/NO NAME
about to run command=diskutil eject /Volumes/NO\ NAME
exitCode=1

The man pages indicate that you can use the mounted path or the path to the device as an argument for umount or diskutil eject.

If I copy the command to the terminal and run it, then it works perfectly. I suspect it's something related to the environment, but as you can see I'm not sending an envp to the exec method.

What's a programmer gotta do to make the eject/unmount work?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甚是思念 2024-12-10 22:44:36

您是否尝试过使用 ProcessBuilder 而不是运行时.exec()?它可以让您精确指定每个参数,还可以让您构建一个环境。

...或者至少使用 Runtime.exec() 指定参数数组而不是字符串。

我猜你的空格转义不起作用 - Runtime.exec() 使用 StringTokenizer 处理空格,并且可能不像大多数 shell 那样智能。

Have you tried using ProcessBuilder rather than Runtime.exec()? It lets you specify each of the arguments precisely, and it also lets you construct an environment.

...or at least use the form of Runtime.exec() specifying an array of arguments rather than a string.

I would guess that your escaping of spaces isn't working -- the convenience form of Runtime.exec() handles spaces using StringTokenizer and probably isn't as smart as most shells.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文