不使用renameTo()重命名文件 - Java

8
忽略我上一篇帖子,我已经找到了问题的根源。我正在使用。
a.renameTo(b)

当b不存在时,原因是存在符号链接。如果b是/usr/name/folder/file,那么b实际上是/mnt/MountTest,因为符号链接指向该目录。

因此问题是,是否有一种使用字符串值重命名Java文件的替代方法?如果没有,如何以不同的方式执行此重命名过程?

5个回答

6
重命名文件在不同的文件系统中也是一个极其棘手的问题。请参见 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4073756。此错误报告的评论者发布了一些示例代码,并指出您可以使用Process.exec。Apache Commons IO和Google Guava都提供了安全移动文件的工具:

6

如果在同一文件系统上,重命名将会更改它的名称。

如果renameTo()失败,你需要将其复制到新位置,然后删除原始文件。


4

我认为你混淆了一些概念。java.util.File并不代表某个文件系统上的文件,它表示的是一个文件的路径。


3

问题并不在于有符号链接的存在;问题在于你无法原子性地跨文件系统重命名。元问题是Java文件操作设计得很糟糕,当出现错误时没有抛出适当的异常或提供错误代码。


1

这样怎么样:

a.renameTo(new File("/your/path/here/");

那行不通,因为文件在新的文件路径中不存在...重命名是用来模拟“mv”的方式,实质上是将文件从一个目录移动到另一个目录。 - Hristo
1
@Hristo:实际上,那正是导致我的问题的原因:人们将renameTo描述为“mv”的等效操作。但是,mv能够意识到文件系统,而renameTo却不能。如果你试图将文件从一个磁盘/分区移动到另一个磁盘/分区,则mv会作为cp和rm序列进行操作,而renameTo则不会。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接