Mac Éjecte le disque USB du programme Java


J'essaie d'éjecter une clé USB sur Mac à partir d'un programme Java. J'ai essayé umount et diskutil eject et ni l'un ni l'autre ne fonctionne. J'obtiens un code de sortie de 1 des deux. Si je retire physiquement le lecteur, Mac OS X me donne l'avertissement standard.

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

La sortie:

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

Les pages de manuel indiquent que vous pouvez utiliser le chemin monté ou le chemin d'accès au périphérique comme argument pour umount ou diskutil eject.

Si je copie la commande sur le terminal et exécute il, puis il fonctionne parfaitement. Je soupçonne que c'est quelque chose lié à l'environnement, mais comme vous pouvez le voir, je n'envoie pas d'envp à la méthode exec.

Qu'est-ce qu'un programmeur doit faire pour que l'éjection/démontage fonctionne?

Merci!

Author: bmauter, 2011-09-09

1 answers

Avez-vous essayé d'utiliser ProcessBuilder plutôt que de l'Exécution.exec ()? Il vous permet de spécifier chacun des arguments précisément, et il vous permet également de construire un environnement.

...ou au moins utiliser la forme de Runtime.exec () spécifiant un tableau d'arguments plutôt qu'une chaîne.

Je suppose que votre échappement des espaces ne fonctionne pas-la forme pratique de Runtime.exec () gère les espaces en utilisant StringTokenizer et n'est probablement pas aussi intelligent que la plupart Shell.

 1
Author: Jason S, 2011-09-09 15:46:23