【问题标题】:Attempting to rename a File in Java does not work (using java.io.File.renameTo method)尝试在 Java 中重命名文件不起作用(使用 java.io.File.renameTo 方法)
【发布时间】:2018-10-22 14:40:04
【问题描述】:

我有一个方法可以加载文件,进行一些更改,然后再次保存。但是,为了防止保存过程中出现异常,我创建了一个新文件并首先保存到该文件中(因为格式不正确的数据可能会在保存过程中导致异常)。保存完成后,我删除原始文件并将新文件重命名为原始文件的名称。

代码基本上是这样的:

MyDataClass.save(tempfile);
originalfile.delete();
tempfile.renameTo(originalfile);

问题是对 renameTo 方法的调用总是返回 'false' 并且新文件 (tempfile) 仍然使用它创建时使用的随机名称(原始文件 is 已删除)。

有人猜到重命名失败的原因吗?

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?我的猜测是您尝试根据原始名称重命名新文件,但原始文件已被删除,因此无法正常工作。
  • 你关闭了你的originalfile 吗?
  • 我遇到的问题是,当我创建了一个最小/可验证的示例时(创建两个文件,每个文件只添加一个单词以进行识别,删除一个并使用剩余的 File-Object 重命名另一个) 它确实有效。这就是我如此困惑的原因。
  • @AnjuMaaka 很好,如果这个小例子有效,你能慢慢建立它,边做边测试,看看它在什么时候坏了,为什么?
  • 操作系统是什么?

标签: java file filenames file-rename


【解决方案1】:

请参阅 Files.move 了解较新的类 Path、Paths 和 Files。

MyDataClass.save(tempfile);
Files.move(tempfile.toPath(), originalfile.toPath(),
    StandardCopyOption.REPLACE_EXISTING,
    StandardCopyOption.ATOMIC_MOVE);

这当然假设save 正确关闭了临时文件。

【讨论】:

  • 这也是我的怀疑:save 方法没有关闭流,并且由于文件被锁定,重命名无法工作。
  • @aka-one 不幸的是,File.renameTo 也有点臭名昭著,尤其是跨磁盘。所以我不能直接指责代码。
  • 我同意,行为也取决于平台,但对我来说,保存方法仍然是首先要检查的。
  • 我终于找到了问题所在。问题是,我使用的是 Apache POI(Microsoft Excel 库),它不会像应有的那样保存更新。尝试保存到现有文件会导致异常,所以我想我会保存到第二个文件,然后删除原始文件/重命名新文件。然而,事实证明,将其保存到新文件的行为也会导致它保存到原始文件!所以我只需要保存到一个临时文件然后删除它...
【解决方案2】:

我猜这可能是因为程序无法检查文件删除的最近状态。您可以通过尝试以下代码来调试它:

MyDataClass.save(tempfile);
if(originalfile.delete()==true){
tempfile.renameTo(originalfile);
}
else{
System.out.println("File is not deleted");
}

或者你可以试试这个。

MyDataClass.save(tempfile);
originalfile.delete();
Thread.sleep(4000);//Make the thread sleep so that the recent status can be detected
tempfile.renameTo(originalfile);

另外,我看到您使用了 MyDataClass.save 来保存文件。请检查您是否在保存后关闭了文件。

如果文件在您尝试重命名时被锁定,则可能无法正常工作

另外,如果您使用 Windows 资源管理器查看文件,您可能需要刷新以查看最近创建的文件

【讨论】:

  • 都试过了。两者都没有改变结果。可能是使用 Apache POI(Excel 库)引起的问题
  • @Anju 我看到你使用了 MyDataClass.save 来保存文件。请检查您是否在保存后关闭了文件。
  • 我终于找到了问题所在。问题是,我使用的是 Apache POI(Microsoft Excel 库),它不会像应有的那样保存更新。尝试保存到现有文件会导致异常,所以我想我会保存到第二个文件,然后删除原始文件/重命名新文件。然而,事实证明,将其保存到新文件的行为也会导致它保存到原始文件!所以我只需要保存到一个临时文件然后删除它...
【解决方案3】:

我终于找到了问题所在。问题是,我使用的是 Apache POI(Microsoft Excel 库),它不会像应有的那样保存更新。尝试保存到现有文件会导致异常,所以我想我会保存到第二个文件,然后删除原始文件/重命名新文件。然而,事实证明,将其保存到新文件的行为也会导致它保存到原始文件!所以我只需要保存到一个临时文件然后删除它...

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2023-03-21
    • 2019-08-02
    • 1970-01-01
    • 2020-11-21
    • 2018-01-05
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多