FileUtilが動かない?

仕事でSAStrutsのAction上でファイルをコピーするという必要があった。

Seasarには便利なUtilがたくさんあるので使うことにした。
org.seasar.framework.util.FileUtil#copy(File src, File dest)
という便利なクラス、メソッドがあるのだ。

しかし動かない。例外は発生しないんだがコピーはされていないようだ。ためしに、
org.apache.commons.io.FileUtils.copyFile(File src, File dest)
を使ってみたら、ちゃんと動いた。具体的に言うと、SeaserのFileUtilではコピー先のファイルが存在しないときにコピーされないのだ。

調べてみた。
org.seasar.framework.util.FileUtil#copy(File src, File dest)の最初の部分を抜粋すると、

    public static void copy(File src, File dest) {
        if (dest.canWrite() == false
                || (dest.exists() && dest.canWrite() == false)) {
            return;
        }

ん? dest.canWrite() == false とある。File#canWrite の説明をみてみると

ファイルシステムにこの抽象パス名が示すファイルが実際にあり、さらにアプリケーションがそのファイルに書き込める場合は true、そうでない場合は false

とある。つまり、コピー先のファイルが存在しないときは、dest.canWrite()がかならずfalseになり、returnしてしまう。なので判定としては、 || 以降の (dest.exists() && dest.canWrite() == false) だけでよいような気がするのだ。


仕事では、Commons-IOのFileUtilsを使うことにしました。