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

John Hendrikx hjohn at xs4all.nl
Sat Dec 19 16:05:40 PST 2009


Alan Bateman wrote:
> 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);
>    }
I indeed do it as:

path.moveTo(path.getParent().resolve(newName));

But I think in my case, path always has a valid parent.

>> 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)
That might have been me.  I'm still in favor of having a distinct rename 
method, even if it just redirects to moveTo internally, if only to avoid 
confusion.  For my specific needs it is always clear when I want a 
rename or a move as the move case must be implemented by a 
copy+verify+delete (so I cannot let the default implementation do the 
move).  If a move accidently occurs when I really wanted a rename it 
would be a bug that needed fixing.  NOCOPY_ALLOWED helps to find those 
bugs instead of it silently doing a potentially very slow move operation.
 
The pitfall of the current moveTo is that it can be lightning fast or 
potentially take hours.  With copyTo I know what I'm getting in to.  
With a renameTo the same thing :)

--John


More information about the nio-dev mailing list