File.renameTo()失败

我有eclipse插件jface应用程序。 线程通过BufferedWriter写入文件。 写完后我关闭缓冲区后我尝试重命名文件。

但有时文件不会重命名!

我尝试在几次重试之间添加一些Thread.Sleep(BIG_NUMBER),这没有用。

它看起来像文件获得某种锁定。 (当我杀死jvm时,我可以重命名该文件)。

有什么我可以做的吗?

操作系统:Windows XP,Windows 7 JAVA版本:1.5

File.RenameTo()依赖于平台,并且依赖于要满足的几个条件才能成功重命名文件,更好的选择是使用

Path source = currentFile.toPath(); try { Files.move(source, source.resolveSibling(formattedName)); } catch (IOException e) { e.printStackTrace(); } 

在这里阅读更多。

来自javadocs:

此方法行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是primefaces的,如果具有目标抽象路径名的文件,它可能不会成功已经存在。 应始终检查返回值以确保重命名操作成功。

请注意,Files类定义了以独立于平台的方式移动或重命名文件的移动方法。

要使File.renameTo()起作用,该文件需要以某种方式由外部应用程序写入。

您也可以执行以下操作:

 File o=new File("oldFile.txt"); File n=new File("newFile.txt"); n.delete(); o.renameTo(n); 

n.delete() :如果存在,我们需要删除文件(new.txt)。

o.rename(n) :以便将文件(old.txt)重命名为new.txt

如何找出renameTo()失败的原因?

Windows上可靠的File.renameTo()替代方案?

http://www.bigsoft.co.uk/blog/index.php/2010/02/02/file-renameto-always-fails-on-windows

我们在Windows 7下遇到了UAC和意外的文件权限问题。 即使执行文件I / O的任何尝试都将失败, File#canWrite也将返回true。

  1. 确保您尝试重命名的文件确实存在
  2. 确保可以访问您尝试写入文件(或重命名文件)的位置。 我们在该位置写一个简单的文本文件,在我们尝试进一步的I / O之前检查它是否存在以及它的内容是否正确(我们是偏执的)。

这对我来说很好。 重命名是使用两个步骤完成的,但不要忘记在manifest.xml设置权限:

   public boolean RenameFile(String from, String to) { to.replace(" ", ""); // clear all spaces within file name File oldfile = new File(from); File newfile = new File(to); File tempfile = new File(to + ".tmp"); // add extension .tmp oldfile.renameTo(tempfile); return (tempfile.renameTo(newfile)); }