kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

File#renameTo(File file)で、移動できない

事象

  • Java
  • Linuxだとファイル移動できるのだけれど、Windowsだと移動できない。
  • renameToの引数のFileオブジェクトとなるファイル自体を 直前の処理で、FileInputStreamでオブジェクトを生成し、そのStreamを使っていた。
    • Streamを閉じていないから移動できないというだけだった。とほほ・・・。
内部の動き

renameToはファイルシステムの機能?を利用してファイルを移動する。

renameToのソースを追ってみると、

java.io.Fileの  renameTo(File)
   ↓
java.io.Win32FileSystemの rename(File file, File file1)
   ↓
java.io.WinNTFileSystemの native boolean rename0(File file, File file1);

native が付いてる。もう追えない。

native修飾子:メソッドの実装がJava以外の言語で記述されコンパイルされていることを示す。

それぞれのクラスのコードは、以下のような感じ。jadclipseを使って
表示した結果に基づき表示しています。

Fileクラス

package java.io;

public boolean renameTo(File file)
    {
        SecurityManager securitymanager = System.getSecurityManager();
        if(securitymanager != null)
        {
            securitymanager.checkWrite(path);
            securitymanager.checkWrite(file.path);
        }
        return fs.rename(this, file);
    }

Win32FileSystemクラス

package java.io;
    public boolean rename(File file, File file1)
    {
        cache.clear();
        prefixCache.clear();
        return rename0(file, file1);
    }

WinNTFileSystemクラス

package java.io;

protected native boolean rename0(File file, File file1);