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を使うことにしました。