web-dev-qa-db-ja.com

JDK7でファイルの名前を変更する(移動しない)にはどうすればよいですか?

JDK7のこれらすべての新しいファイルI/Oクラスと少し混乱しています。

たとえば、Pathがあり、それが表すファイルの名前を変更したいとします。再びPathが予想される場合、新しい名前を指定するにはどうすればよいですか?

Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */

注:なぜJDK7が必要なのですか? シンボリックリンクの処理

問題は、実行時に名前と場所がわかっているファイルでそれを行わなければならないということです。したがって、私が必要としているのは、safeメソッド(例外的な副作用なし)で、新しい名前-Pathの古い名前-Pathを作成することです。

Path newName(Path oldName, String newNameString){
    /* magic */ 
}
22

パス文字列があり、Pathインスタンスを作成する必要があります。これは、getPathメソッドまたはresolveを使用して実行できます。これが1つの方法です:

Path dir = oldFile.getParent();        
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);        
oldFile.moveTo(target); 

親がnullかどうかをチェックすることに注意してください(ソリューションがそれを行わないように見えます)。

8
Alan

JDK7では、 Files.move() は、ファイルの名前を変更するための短く簡潔な構文を提供します。

Path newName(Path oldName, String newNameString) {
    return Files.move(oldName, oldName.resolveSibling(newNameString));
}

まず、 Path.resolveSibling() を使用して新しいファイル名へのパスを取得し、 Files.move() を使用して実際の名前を変更します。

60
Avner

OK、すべてを試した後、私は正しい方法を見つけたようです:

// my helper method
Path newName(Path oldFile, String newNameString){
    // the magic is done by Path.resolve(...)
    return oldFile.getParent().resolve(newNameString);
}

// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
4

Apache Commons IO を見ると、 FileNameUtils というクラスがあります。これはたくさんのことをします。ファイルのパス名と、(とりわけ)パス名などを確実に分割します。これにより、必要なものに向けて長い道のりを歩むことができると思います。

1
Brian Agnew

宛先パスが送信元パスと同じである場合ファイルの名前を除く、移動されるのではなく名前が変更されます。

したがって、あなたの例では、movetoパスは次のようになります。

/home/me/file456
0
pavium