目录不为空 java.io.IOException
Directory not empty java.io.IOException
我需要从我的 JavaFX 应用程序启动一个名为 TeamViewer 的外部应用程序。
所以我有 TeamViewer.app 文件,我正在将其复制到一个临时文件夹并使用以下命令启动它:
Runtime.getRuntime().exec("open /path/to/Teamviewer.app");
但这是抛出 Directory not empty 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
正如我所怀疑的,运行时本身有问题!还有一个 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 using COPY_ATTRIBUTES 选项替换上面的方法解决了问题。
我需要从我的 JavaFX 应用程序启动一个名为 TeamViewer 的外部应用程序。 所以我有 TeamViewer.app 文件,我正在将其复制到一个临时文件夹并使用以下命令启动它:
Runtime.getRuntime().exec("open /path/to/Teamviewer.app");
但这是抛出 Directory not empty 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
正如我所怀疑的,运行时本身有问题!还有一个 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 using COPY_ATTRIBUTES 选项替换上面的方法解决了问题。