2011-09-09 6 views
3

JavaプログラムからMac上でUSBサムドライブを取り出そうとしています。私はumountとdiskutil取り出しを試していてどちらも動作していません。私は両方から1の終了コードを取得します。物理的にドライブを引き出すと、Mac OS Xは私に標準的な警告を出します。Macプログラムから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 

manページを使用すると、アンマウントまたはdiskutilイジェクトの引数としての装置に装着されたパスまたはパスを使用することができることを示しています。

端末にコマンドをコピーして実行すると、完全に動作します。私はそれが環境に関係するものだと思っていますが、あなたが見ることができるように私はexecメソッドにenvpを送信していません。

イジェクト/アンマウント作業を行うにはどうすればよいですか?

ありがとうございます!

答えて

1

Runtime.exec()ではなくProcessBuilderを試しましたか?各引数を正確に指定できるほか、環境を構築することもできます。

...または少なくともRuntime.exec()の形式を使用して、文字列ではなく引数の配列を指定します。

スペースのエスケープが機能していないと思います。Runtime.exec()の便利な形式はStringTokenizerを使用してスペースを処理します。おそらくほとんどのシェルほどスマートではありません。

+0

ありがとうございました!私は文字列の配列を使用するように切り替えました。私はまた、スペースの置換を "\"で取り除かなければなりませんでした。 – bmauter

関連する問題