Renaming a file without using renameTo() - Java
Asked Answered
D

5

8

Disregarding my last post, I've found the source of the problem. I'm using

a.renameTo(b)

when b doesn't exist. The reason it doesn't exist is because there is a symbolic link so if b is /usr/name/folder/file, then b really is /mnt/MountTest because the symlink is to that directory.

So the question is, is there an alternative way to rename a file in Java using a string value? If not, how can this rename procedure be done differently?

Dialect answered 6/1, 2010 at 16:50 Comment(0)
I
6

A rename would rename it... if it were on the same filesystem.

If a renameTo() fails, you'll need to copy it to the new location, then delete the original.

Ignore answered 6/1, 2010 at 17:19 Comment(0)
O
6

Renaming files is also highly problematic accross file systems. See https://bugs.java.com/bugdatabase/view_bug?bug_id=4073756. Commenters of the bug report posted some sample code and also pointed out that you can use Process.exec. Both Apache Commons IO and and Google Guava have utilities for safely moving files as well:

Occupy answered 14/5, 2010 at 16:0 Comment(0)
C
4

I think you are confusing things. A java.util.File doesn't represent a file on some filesystem. It represents a path to a file.

Catto answered 6/1, 2010 at 17:3 Comment(0)
S
3

The problem is not that a symlink is involved; the problem is that you can't atomically rename across filesystems. The meta-problem is that the Java File operations are badly designed, and don't throw proper exceptions, and provide no error codes when something fails!

Sarita answered 6/1, 2010 at 16:52 Comment(0)
M
1

How about:

a.renameTo(new File("/your/path/here/");
Marhtamari answered 6/1, 2010 at 16:53 Comment(2)
that won't work because the file doesn't exist in the new file path... the rename is used in a way to mimic a "mv", essentially moving the file from one directory to anotherDialect
@Hristo: Actually, that is precisely what caused me issues: people describing renameTo as the equivalent of "mv". mv is aware of file systems, whereas renameTo is not. If you attempt to mv from one disk/partition to another, it acts as a cp and rm sequence, which renameTo does not.Stuccowork

© 2022 - 2024 — McMap. All rights reserved.