user972276
user972276

Reputation: 3053

java renameTo method not working

I know this has been probably answered a million times on here but everything I have looked at has not helped me. Here is my code:

for(File g: f.listFiles()){
    for(File h : g.listFiles()){
        try{
            Scanner s = new Scanner(h);
            String timestamp = s.next().split("[?]")[4];
            File z = new File(h.getAbsolutePath().split("[.]")[0] + timestamp + h.getAbsolutePath().split("[.]")[1]);
            boolean q = h.renameTo(z);
        }catch(Exception e){

        }
    }
}

I have checked to see if File z exists and it doesnt. I have checked if File h exists and it does. I have doublechecked that h is an absolute path. If I print the absolute path of z, I get the correct path. None of the directories in f or files in g are open. The files denoted by h are not open. Could there be some flag set or something on the file where windows is not allowing my program to rename it?

Upvotes: 1

Views: 4897

Answers (3)

user2464919
user2464919

Reputation: 11

I had a almost same issue. Some of rename cases succeeded, some failed. For those failed cases, I found, the source file path and destination file path are not on in same file system. In my cases, the NTFS mounted another file system which the destination file would be moved to. Since the rename function's original purpose simply rename a name, not to move the data of the concerned file. If both source file path and destination file path are in different file system, some version of JVM will fail on certain platforms. Actually, it is a bug in java.io and Solaris has fixed this bug in new versions. Good Luck!

HappyForever,

Upvotes: 1

Jeremy Brooks
Jeremy Brooks

Reputation: 589

The behavior of renameTo varies from platform to platform. Operations that succeed on one platform may fail on another. For example, on my local development workstation (OS X), everything worked as expected. On a production system (Solaris), renameTo failed consistently. I finally determined that it failed when the files were located on different partitions. Obviously that is not the case here, but it illustrates that the method can behave in unexpected ways.

To get consistent behavior, copy the data to a new file, then delete the original.

Upvotes: 2

Codey McCodeface
Codey McCodeface

Reputation: 3028

My guess is that you are having a similar problem to one I had here File deletion/moving failing

Try using FileinputStreams for the Scanner

FileInputStream fin = new FileInputStream(h);
fin.open()
Scanner s = new Scanner(fin);
//do work
fin.close()

and closing the stream before renaming

Upvotes: 3

Related Questions