3

我正在尝试使用 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 方法来解决这个问题。

4

1 回答 1

4

.app简单的答案是OSX 术语中没有文件之类的东西。您看到的 .app 是一个文件夹。尝试将其作为文件读取时会收到 FileNotFound,因为它不是文件。

如果您使用的是 Java 7,则可以使用新的Files.move()方法来执行您想要的操作,无论它是文件还是文件夹。

编辑:正如MadProgrammer在评论中建议的那样,简单地使用已经存在更长的File.renameTo()会更容易。

于 2012-10-29T22:12:38.113 回答