【问题标题】:File renameTo does not work文件 renameTo 不起作用
【发布时间】:2012-04-01 18:00:10
【问题描述】:

我正在尝试为JFileChooser 选择的文件名添加扩展名,尽管我无法让它工作。

这是代码:

final JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showSaveDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File f = fc.getSelectedFile();
            String name =f.getAbsoluteFile()+".txt";
            f.renameTo(new File(name));
            FileWriter fstream;
            try {
                fstream = new FileWriter(f);
                BufferedWriter out = new BufferedWriter(fstream);
                out.write("test one");
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

我不明白为什么这不起作用。我也尝试使用 getPath() 和 getCanonicalPath() 但结果是一样的。该文件在所选目录中创建,但没有“.txt”扩展名。

【问题讨论】:

  • 你检查过renameTo的结果了吗?这来自 Java 文档“此方法是否可以将文件从一个文件系统移动到另一个文件系统取决于平台。应始终检查返回值以确保重命名操作成功。”
  • 是的,它总是返回 false。它唯一有效的时候是我手动设置新文件名但不包括路径:“test.txt”。这创建了一个包含“test one”但不在所选目录中的txt
  • 您确定目标文件不存在吗?
  • 是的。创建了一个新文件,但没有扩展名。我只是在桌面上进行测试,所以我可以看到发生了什么。
  • 你能用File f2 = new File(name);创建一个文件吗?

标签: java jfilechooser


【解决方案1】:

在我看来,您要做的只是更改所选文件的 name,而不是重命名文件系统上的文件。在这种情况下,您不使用File.renameTo。您只需更改File。像下面这样的东西应该可以工作:

        File f = fc.getSelectedFile();
        String name = f.getAbsoluteFile()+".txt";
        f = new File(name);

File.renameTo 尝试重命名文件系统上的文件。例如:

File oldFile = new File("test1.txt");
File newFile = new File("test2.txt");
boolean success = oldFile.renameTo(newFile); // renames test1.txt to test2.txt

在这三行之后,如果文件test1.txt 可以重命名为test2.txt,则success 将是true,如果重命名不成功(例如test1.txt 不存在,则为false)在另一个进程中打开,权限被拒绝等)

我会冒险猜测您尝试重命名失败是因为您尝试重命名目录(您正在使用带有DIRECTORIES_ONLY 选项的JFileChooser)。如果您有程序使用此目录中的文件,或在其中打开命令提示符,它们将反对重命名此目录。

【讨论】:

  • 是的,你是对的,我最终只是使用选择器中的名称(目录)创建了一个新文件。我只是认为 renameTo 是可以在这种情况下使用的操作。
  • 在我的例子中,BufferedReader 是打开的。因此无法重命名文件。
【解决方案2】:

如果要重命名文件,则必须关闭所有对象(如FileReader,FileWriter,FIS,FOS意味着关闭正在读取的文件对象然后重命名它

【讨论】:

  • 虽然这可能是解决问题的宝贵提示,但答案确实需要比这更多的细节。请edit 提供示例代码来说明您的意思。或者,请考虑将其写为评论。
【解决方案3】:

您正在写入错误的文件。当您调用 renameTo 时,当前文件不会更改其路径。试试这个:

final JFileChooser fc = new JFileChooser();
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int returnVal = fc.showSaveDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        String name =f.getAbsoluteFile()+".txt";
        File f2 = new File(name);
        f.renameTo(f2);
        FileWriter fstream;
        try {
            fstream = new FileWriter(f2);
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("test one");
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

【讨论】:

  • 这并没有真正使用 renameTo 方法。虽然它有效。
【解决方案4】:

您还可以使用 Google Guava 库中的 Files.move 实用程序来重命名文件。它比编写自己的方法更容易。

来自文档:

将文件从一个路径移动到另一个路径。此方法可以重命名文件或将其移动到不同的目录,例如 Unix mv 命令。

【讨论】:

    【解决方案5】:

    您需要创建一个新实例来引用文件的新名称

    oldFile = new File(newName);
    

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2012-01-26
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2018-06-30
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多