NIO2's Path.moveTo(...) needs renameTo(...) aequivalent,or at least javadoc clarification.

Alan Bateman Alan.Bateman at Sun.COM
Thu Dec 17 13:19:54 PST 2009


Salter, Thomas A wrote:
> It seems like Path could use a getSibling(String name) method which effectively replaces the last node of the path with the name parameter.  Then your code could be:
>   oldFile.moveTo( oldFile.getSibling( newNameString ) );
>
> I'd guess it's a fairly common occurrence to want to get the name of a file in the same directory as a known file, like a .h that goes with a .c file.
>   
There is merit in this. Most of the time it's just 
foo.getParent().resolve(bar) but we have the corner-case where the path 
is a simple file name. The corner case means we have to something like this:

    Path resolveSibling(Path file, String name) {
        Path dir = file.getParent();
        return (dir != null) ? dir.resolve(name) : 
file.getFileSystem().getPath(name);
    }

> Likewise, a variant of subpath that returns just the last node would be useful, rather than writing:
>         int lastNode = file.getNameCount() - 1;
>         Path last = file.subpath(lastNode, lastNode);
>   
Did you mean subpath(lastNode, lastNode+1)? That would return the 
filename and getName() already does this (just mentioning in case you 
missed it or I mis-understood the intention).

> :
>
> Wouldn't it be good, to create a Path.renameTo(String newName) method?
>   
It's also possible to rename to other locations in the file system. 
That's what File.renameTo(File) does. So f.renameTo(new File("bar")) 
will attempt to rename f into the current directory (not necessarily f's 
directory).  Path.moveTo(Path,CopyOption...) is just more general and 
gives you control on if an existing file is replaced or not.

There was a question on this mailing list back in September asking for a 
way to rename, guaranteeing that the file isn't copied. If we have that 
then rename becomes:
  source.moveTo(target, NOCOPY_ALLOWED)

> Or at least add clarification in javadoc? (Which is far less appropriate, an API has to "talk" to the user by classes and methods names)
>
> I'm afraid, most people will start using File.renameTo(File newFile), which would fail to handle symbolic-link correctly.
> Or, what is even worse, people will try to concat some strings, and create a destination Path of the result.
>
> Something like:
>     Path newName = Paths.get(name.getParent().toString()+File.pathSeparator+"newName");
>
> While someone would even do:
>     name.getParent().toString()+"\\"+"newName", or name.getParent().toString()+"/"+"newName"
>   
The resolve method is the easiest way to combine or join paths, so the 
above can be replaced with:
  name.getParent().resolve("newName");

-Alan.


More information about the nio-dev mailing list