我正在尝试使用 FileInputStream 的 transferTo 方法在 OS X 中移动应用程序文件,但不断收到 FileNotFoundException(没有这样的文件或目录)。我知道情况并非如此,因为 .exists() 方法在我在应用程序文件上运行时返回 true。我认为这与文件权限有关,但经过几次测试后似乎并非如此。这是我用来移动文件的代码:
public static void moveFile(File sourceFile, File destFile) throws IOException {
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
long count = 0;
long size = source.size();
source.transferTo(count, size, destination);
}
finally {
if(source!=null) {
source.close();
}
if(destination!=null) {
destination.close();
}
}
}
编辑 1:标题已从“在 os x 中移动 .app 文件”更改为“在 os x 中复制 .app 文件”。我需要保持原始文件完好无损。
编辑 2:我能够按照Joel Westberg 的建议(特别是 copyDirectory 方法)通过Apache Commons FileUtils 复制文件。我现在面临的问题是,当我去运行复制的应用程序包时,该应用程序会永远在 Dock 中弹跳并且永远不会运行。关于为什么会这样的任何想法?
编辑 3:我已经想出了如何解决永久弹跳的问题。事实证明,当我复制应用程序包时,它没有将 2 个 unix 脚本设置为需要的可执行文件。我只是使用 File 类中的 setExecutable 方法来解决这个问题。