2015-05-27 4 views
0

Мне нужно запустить внешнее приложение TeamViewer из моего приложения JavaFX. Так что я TeamViewer.app файл, который я копирование во временную папку и запуская его с помощью:Directory not empty java.io.IOException

Runtime.getRuntime().exec("open /path/to/Teamviewer.app"); 

Но это бросает каталог не пустой IOException.
Я также попытался запустить с использованием файла оболочки, где написал команду «open /path/to/Teamviewer.app» для запуска.sh и запустил launch.sh, используя процесс, созданный ProcessBuilder.
если я запустил launch.sh с терминала, он работает. Но из Java программы, следующего исключение:

SEVERE: null 
java.io.IOException: Cannot run program "sh" (in directory "/Applications/ColorDx.app/Contents/Java"): error=66, Directory not empty 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 
    at com.sc.colordx.controller.ColorDxSupportController.executeCommand(ColorDxSupportController.java:288) 
    at com.sc.colordx.controller.ColorDxSupportController.launchSetup(ColorDxSupportController.java:126) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 

Что может быть причиной для каталогов не пустого исключения? Он должен быть не пустым, поскольку я скопировал TeamViewer.app там.
Это может быть проблема с несколькими потоками? Значит, я сначала копирую TeamViewer.app и сразу же запускаю его. Есть ли вероятность, что команда запуска вызывается до завершения копирования?
TIA

+0

Сначала я попытался запустить java .exec (...) в папку, содержащую простое приложение (без этой части копии сначала). Также я бы попытался с помощью 'Process proc = Runtime.getRuntime(). Exec (new String [] {" sh "," simpleapp "}));' Это работает? – chris

+0

нет не работает даже без копирования. Фактически вместо копирования приложения teamviewer через Java я копировал с помощью самой команды оболочки. Значит до «open simpleapp» в launch.sh. Я написал команду cp, чтобы скопировать ее в первую очередь. Но по-прежнему такая же ошибка, что каталог не пуст. –

+0

Итак, я бы предложил исправить проблему «запустить unix-процесс из java». May это помогает: http://stackoverflow.com/questions/525212/how-to-run-unix-shell-script-from-java-code – chris

ответ

0

Как я и предполагал, возникла проблема с самим запуском! Есть еще одно приложение JavaFX, которое действует как установщик для этого приложения (приложение с проблемами Runtime). Для установки этого приложения я использовал следующий код, чтобы скопировать содержимое файла .app:

public static final void copyFile(File source, File destination) throws IOException { 


        FileChannel sourceChannel = new FileInputStream(source).getChannel(); 
        FileChannel targetChannel = new FileOutputStream(destination).getChannel(); 
        sourceChannel.transferTo(0, sourceChannel.size(), targetChannel); 
        sourceChannel.close(); 
        targetChannel.close(); 
     } 


Приведенный выше код не сохранить атрибуты файла при копировании. Замена вышеуказанного метода на Files.copy с использованием опции COPY_ATTRIBUTES позволила решить проблему.