我有 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:
此方法的行为的许多方面本质上是平台相关的:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果具有目标抽象路径名的文件可能不会成功已经存在。应始终检查返回值以确保重命名操作成功。
请注意,Files 类定义了 move 方法以独立于平台的方式移动或重命名文件。
为了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
Windows 上可靠的 File.renameTo() 替代方案?
http://www.bigsoft.co.uk/blog/index.php/2010/02/02/file-renameto-always-fails-on-windows
我们在 Windows 7 下遇到了带有 UAC 和意外文件权限的问题。 File#canWrite
即使执行文件 I/O 的任何尝试都将失败,也会返回 true。
这对我来说很好。重命名使用两个步骤完成,但不要忘记设置权限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));
}