3

FileInputStreamのtransferToメソッドを使用してOSXでアプリファイルを移動しようとしていますが、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:タイトルが「osxに.appファイルを移動する」から「osxに.appファイルをコピーする」に変更されました。元のファイルをそのまま保持する必要があります。

編集2: JoelWestbergによって提案されたApacheCommons FileUtils(具体的にはcopyDirectoryメソッド)使用してファイルをコピーすることができました。私が今直面している問題は、コピーしたアプリバンドルを実行しようとすると、アプリがドック内で永続的にバウンスし、実行されないことです。これがなぜであるかについてのアイデアはありますか?

編集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 に答える