2012-07-19 34 views
1

我知道这可能已经在这里回答了一百万次,但是我看过的所有内容都没有帮助我。这里是我的代码:java renameTo方法不起作用

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){ 

     } 
    } 
} 

我检查过,看看是否存在文件z,它没有。我检查过,如果文件h存在,它确实存在。我已经加倍检查,h是绝对路径。如果我打印z的绝对路径,我会得到正确的路径。 f中的任何目录或g中的文件都不打开。由h表示的文件未打开。有没有一些标志设置或文件上的Windows不允许我的程序重命名?

+1

这可能很容易成为权限问题。是抛出异常,还是'renameTo()'返回'false'? – dlev 2012-07-19 22:40:41

+0

如果z不存在,那么可能你的字符串在新的File()中是不正确的,我不知道所有的分割是什么,因为我不知道如何命名文件。当你只是在filz z = new File(...)的圆括号内打印println()时,输出是什么?另外,在catch块中添加e.printStackTrace();它可以启发你的问题 – 2012-07-19 22:41:13

+0

不会引发异常。假返回 – user972276 2012-07-19 22:42:25

回答

3

我的猜测是,你有类似的问题,以一个我在这里File deletion/moving failing

尝试使用FileinputStreams扫描仪

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

和重命名

+0

ahhh是!谢谢。我完全忘记了我正在用扫描仪打开文件,它不能被重命名,因为它在我的程序中打开。 – user972276 2012-07-19 22:48:52

2

的行为之前关闭流renameTo因平台而异。在一个平台上成功的操作可能会失败。例如,在我的本地开发工作站(OS X)上,一切都按预期工作。在生产系统(Solaris)上,renameTo一致失败。当文件位于不同的分区时,我终于确定它失败了。显然这不是这种情况,但它表明该方法可以以意想不到的方式行事。

要获得一致的行为,请将数据复制到新文件,然后删除原始文件。

1

我有一个几乎相同的问题。一些重命名案件成功,一些失败。对于那些失败的案例,我发现,源文件路径和目标文件路径不在同一个文件系统中。在我的情况下,NTFS挂载了目标文件将被移动到的另一个文件系统。由于重命名函数的原始目的只是重命名一个名称,而不是移动相关文件的数据。如果源文件路径和目标文件路径都位于不同的文件系统中,某些版本的JVM将在某些平台上失败。实际上,这是java.io中的一个bug,Solaris已经修复了新版本中的这个bug。 祝你好运!

HappyForever,

+0

这非常有帮助。原来我们的问题是,我们试图在我们的Unix服务器上的不同挂载点之间renameTo()。将目标目录移动到同一个分区允许renameTo()按预期工作。 – 2014-06-27 22:30:55