8

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

但有时文件没有重命名!

我试图在两次重试之间添加一些 Thread.Sleep(BIG_NUMBER) 这没有帮助。

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

有什么我可以做的吗?

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

4

5 回答 5

15

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

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

在这里阅读更多。

从javadocs:

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

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

于 2012-12-11T18:17:25.783 回答
0

为了File.renameTo()工作,该文件将需要以某种方式可由外部应用程序写入。

于 2012-12-11T18:17:50.720 回答
0

您还可以执行以下操作:

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

于 2012-12-11T18:48:03.213 回答
0

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

  1. 确保您尝试重命名的文件确实存在
  2. 确保您尝试将文件写入(或重命名文件)的位置可访问。在我们尝试任何进一步的 I/O 之前,我们将一个简单的文本文件写入该位置,检查它是否存在以及它的内容是否正确(我们是偏执狂)。
于 2012-12-11T19:35:40.933 回答
0

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />

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));
}
于 2017-01-09T23:14:25.723 回答