【问题标题】:Renaming Files renameTo() workaround Java重命名文件 renameTo() 解决方法 Java
【发布时间】:2017-07-19 03:00:32
【问题描述】:

以下代码 file.renameTo(new File(newPath));不要正确重命名所有文件,它会跳过一些我什至使用过 Files.move(file.toPath(), Paths.get(newPath));但是我在 Eclipse 中收到一个异常错误,说 java.nio.file.FileAlreadyExistsException 我认为这是因为有一组文件在被切断时它们将具有相同的名称有没有办法在 Eclipse 中绕过这个错误或微调 renameTo()?

我也试过 .substring(0,22);, name.replaceFirst("-2017.*", "");和 name.substring(0, file.getName().indexOf("-2017") 结果一样。

示例: 原始文件名:3-M-ALABAMA-SUIQUARTER2-2017200346-CD6140 控制台输出:3-M-ALABAMA-SUIQUARTER2 文件夹中的一些文件未更改:3-M-ALABAMA-SUIQUARTER2-2017200346-CD6140

for(File file:filesInDir) {
       String name = file.getName().substring(0, file.getName().indexOf("-2017"));
       String newName = name;
       System.out.println(newName); // prints prints to file 
       String newPath = absolutePathOne + "\\" + newName;
       file.renameTo(new File(newPath));
       or
       Files.move(file.toPath(), Paths.get(newPath));

【问题讨论】:

  • 这个问题很难读懂,你必须清楚很多。 “当它们被切断时”是什么意思?您尝试重命名的文件的示例是什么?是什么文件阻止它被重命名?
  • 一个例子是原始文件名:3-M-ALABAMA-SUIQUARTER2-2017200346-CD6140 控制台输出:3-M-ALABAMA-SUIQUARTER2 文件夹中的一些文件未更改:3-M-ALABAMA-SUIQUARTER2 -2017200346-CD6140
  • 我添加了其他信息
  • 那么目标文件夹中是否已经有一个新名称的文件?
  • 我的意思是我的意思是我试图从 -2017xxx 中取出所有内容

标签: java eclipse file-io


【解决方案1】:

您不能将特定文件重命名为您正在重命名文件的文件夹中已经存在的文件名。恕我直言......即使可以,出于一系列常识原因,您也不应该这样做。

换句话说,如果我们有一个文件夹(目录)命名为:All_My_Files,并且在这个文件夹中我们有两个文本文件,一个名为MyFile-2016.txt,另一个名为MyFile-2017.txt。现在,我们要重命名这两个文件中的每一个,以便每个文件名中的破折号和年份(即:-2016 或 -2017)不再存在。本质上,您最终会尝试将两个文件名都设为 MyFile.txt,这是不允许的。您的第一次重命名会很好,因为在第一次重命名时,文件夹中没有名为 MyFile.txt 的文件,但是一旦对第二个文件名进行第二次重命名尝试,它就会失败,因为MyFile.txt 名称已存在于从第一次重命名尝试完成的该文件夹中。这不是代码问题,这是本地文件系统的问题。这些是本地文件系统的规则(同一文件夹中的文件不能具有相同的名称)。查看您要重命名的文件名,一旦您删除不需要的文本,是否有任何文件名实际上会创建相同的文件名?如果有那么那些将无法重命名。

这同样适用于移动文件。您不能将文件移动到已包含同名文件的文件夹(目录)。上述文件系统规则适用。但是,您可以覆盖目标路径中现有的重复文件名,如果它在移动过程中存在 if 您告诉 Files.move() 方法这样做:

Files.move(sourcePathAndFileName, destinationPathAndFileName,
           StandardCopyOption.REPLACE_EXISTING);

您需要导入:

导入静态 java.nio.file.StandardCopyOption.REPLACE_EXISTING;

但请记住,在您公然覆盖现有文件之前,您最好确定这是您想要做的。提示用户执行覆盖将是正常的操作过程,但不一定需要特定的内部操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2019-04-19
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多