File.renameTo()没有任何效果。

3
我希望能够重命名一系列文件夹以去除不必要的字符(例如,点和双空格需要变成一个空格)。
在Gui中点击按钮后,将会显示一个格式正确的名称的消息框,这表明格式正确且功能被调用。 当我查看我创建的测试文件夹时,名称没有更改(甚至在刷新后也是如此)。使用硬编码字符串也不起作用。
我漏掉了什么?
public void cleanFormat() {
    for (int i = 0; i < directories.size(); i++) {
        File currentDirectory = directories.get(i);
        for (File currentFile : currentDirectory.listFiles()) {
            String formattedName = "";
            formattedName = currentFile.getName().replace(".", " ");
            formattedName = formattedName.replace("  ", " ");
            currentFile.renameTo(new File(formattedName));
            JOptionPane.showMessageDialog(null, formattedName);
        }
    }
}

我认为你需要删除旧文件并创建新文件。 - kosa
4
javadoc中:请注意,Files类定义了move方法以在跨平台的方式下移动或重命名文件。 - assylias
我在谷歌上查找了一下,发现以下代码出现了多次:File f = new File("Rename.java~"); f.renameTo(new File("junk.dat"));除此之外没有其他内容,你是指这个代码已经过时了还是怎么样? - Jeroen Vannevel
@JeroenVannevel 它并没有被弃用,它是平台相关的,并且可能会根据各种因素而工作或不工作。 根据文档,Files#move似乎更为健壮。 - assylias
@JeroenVannevel 你应该将答案发布为一个回答(你可以回答自己的问题)。 - assylias
@assylias:你修好了,可以看上面的编辑获取可用代码。谢谢! - Jeroen Vannevel
4个回答

7

对于未来的浏览器:这个问题已经在Assylias的评论中得到解决。下面是最终修复它的代码。

public void cleanFormat() {
    for (int i = 0; i < directories.size(); i++) {
        File currentDirectory = directories.get(i);
        for (File currentFile : currentDirectory.listFiles()) {
            String formattedName = "";
            formattedName = currentFile.getName().replace(".", " ");
            formattedName = formattedName.replace("  ", " ");
            Path source = currentFile.toPath();
            try {
                Files.move(source, source.resolveSibling(formattedName));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

0

调用getName()方法仅返回文件名而不包含任何目录信息。因此,您可能正在尝试将文件重命名到另一个目录中。

尝试将包含目录的文件对象添加到重命名操作中。

currentFile.renameTo(new File(currentDirectory, formattedName));

就像其他人所说的那样,您应该检查renameTo的返回值,它可能是false,或者使用Files类中的新方法,我发现它们会抛出非常详细的IOExceptions。


0
首先,File.renameTo 试图在同一文件系统上重命名文件。
以下内容来自 java doc
Many aspects of the behavior of this method are inherently platform-dependent: 
The rename operation might not be able to move a file from one filesystem to 
another, it might not be atomic, and it might not succeed if a file with the 
destination abstract pathname already exists.

0
首先检查返回值,如果重命名成功,则File.renameTo返回true;否则返回false。例如,在Windows上,您无法将文件从c:移动/重命名到d:。 最重要的是,使用Java 7的java.nio.file.Files.move代替。

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