重命名文件而不使用 renameTo() - Java
Posted
技术标签:
【中文标题】重命名文件而不使用 renameTo() - Java【英文标题】:Renaming a file without using renameTo() - Java 【发布时间】:2011-01-02 03:26:36 【问题描述】:忽略我上一篇文章,我找到了问题的根源。我正在使用
a.renameTo(b)
当 b 不存在时。它不存在的原因是因为有一个符号链接,所以如果 b 是 /usr/name/folder/file
,那么 b 真的是 /mnt/MountTest
,因为符号链接指向那个目录。
所以问题是,有没有另一种方法可以使用字符串值在 Java 中重命名文件? 如果不是,这个重命名过程如何以不同的方式完成?
【问题讨论】:
【参考方案1】:问题不在于涉及符号链接;问题是您不能跨文件系统自动重命名。元问题是 Java File 操作设计得很糟糕,不会抛出适当的异常,并且在某些事情失败时不提供错误代码!
【讨论】:
【参考方案2】:怎么样:
a.renameTo(new File("/your/path/here/");
【讨论】:
这不起作用,因为新文件路径中不存在该文件...重命名用于模仿“mv”,实质上是将文件从一个目录移动到另一个 @Hristo:实际上,这正是引起我问题的原因:人们将 renameTo 描述为“mv”的等价物。 mv 知道文件系统,而 renameTo 不知道。如果您尝试从一个磁盘/分区 mv 到另一个,它将充当 cp 和 rm 序列,而 renameTo 不会。【参考方案3】:我认为你把事情搞糊涂了。 java.util.File 不代表某些文件系统上的文件。它表示文件的路径。
【讨论】:
【参考方案4】:重命名会重命名它...如果它在同一个文件系统上。
如果 renameTo() 失败,您需要将其复制到新位置,然后删除原始位置。
【讨论】:
【参考方案5】:重命名文件也是跨文件系统的大问题。见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4073756。错误报告的评论者发布了一些示例代码,并指出您可以使用 Process.exec。 Apache Commons IO 和 Google Guava 都有用于安全移动文件的实用程序:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/Files.html#move(java.io.File,%20java.io.File) https://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/FileUtils.html#moveFile(java.io.File,%20java.io.File)【讨论】:
以上是关于重命名文件而不使用 renameTo() - Java的主要内容,如果未能解决你的问题,请参考以下文章
Linux 下 java 的File类的renameTo()方法 不能重命名文件