2011-09-09 24 views
3

我試圖從Java程序彈出USB上的USB磁盤驅動器。我試過卸載和diskutil彈出,都沒有工作。我從兩個退出代碼都是1。如果我將硬盤拉出來,Mac OS X會給我提供標準警告。Mac從Java程序中彈出USB磁盤

我的代碼:

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 

手冊頁表明您可以使用安裝路徑或路徑設備作爲卸除或磁盤工具彈出的參數。

如果我將命令複製到終端並運行它,那麼它完美的工作。我懷疑它是與環境有關的東西,但正如你所看到的,我沒有發送envp到exec方法。

什麼是程序員必須做的彈出/卸載工作?

謝謝!

回答

1

您是否嘗試過使用ProcessBuilder而不是Runtime.exec()?它可以讓你精確地指定每個參數,還可以讓你構建一個環境。

...或至少使用Runtime.exec()的形式指定參數數組而不是字符串。

我猜想你的空間轉義行不通 - Runtime.exec()的便利形式使用StringTokenizer處理空間,可能不像大多數shell那麼聰明。

+0

謝謝,就是這樣!我切換到使用字符串數組。我也不得不用「\」來取代空格。 – bmauter