目录不是空的java.io.IOException

时间:2015-05-27 05:51:43

标签: java macos io external runtime.exec

我需要从我的JavaFX应用程序启动一个名为TeamViewer的外部应用程序。 所以我将TeamViewer.app文件复制到临时文件夹并使用以下命令启动它:

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

但是这会抛出Directory而不是IOException 我也尝试使用shell文件启动我写的" open /path/to/Teamviewer.app"命令到launch.sh并使用ProcessBuilder创建的进程启动launch.sh。
如果我从终端运行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

1 个答案:

答案 0 :(得分:0)

正如我所怀疑的,运行时本身存在问题!还有一个JavaFX应用程序充当此应用程序的安装程序(具有运行时问题的应用程序)。为了安装这个应用程序,我使用以下代码来复制.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替换上述方法解决了这个问题。