2

我正在尝试列出目录的内容,并重命名某些文件。

public void run(String dirName) {
    try {
        File parDir = new File(dirName);
        File[] dirContents = parDir.listFiles();

        // Rename if necessary
        for(File f : dirContents) {
            System.out.println("f is:\n" + f.toString());
            String name = f.getName();
            String subbedName = name.replaceAll("\uFFFD", "_");

            System.out.println("\n" + "name = " + name + ", subbedName = " + subbedName + "\n");

            if(!name.equals(subbedName)) {
                File newFile = new File(f.getParentFile(), subbedName);
                System.out.println("newFile is:\n" + newFile.toString());
                if(!f.renameTo(newFile))
                    System.out.println("Tried to change file name but couldn't.");
            }
        }
    }
    catch(Exception exc1) {
        System.out.println("Something happened while listing and renaming directory contents: " + exc1.getMessage());
    }
}

当我运行它时,我得到“ Tried to change file name but couldn't.”我不相信Java 认为这些文件是“打开的”,所以我认为这不是原因。我什至跑过传递给方法的字符串的值在chmod 777 myDir哪里。myDirdirNamerun

我在这里想念什么?为什么 Java 不重命名这些文件?这些是 CentOS 机器。

编辑f:为和都添加了打印输出,newFile如下所示:

f is:
/root/path/to/mydir/test�.txt

newFile is:
/root/path/to/mydir/test_.txt
4

3 回答 3

2

您需要使用这些文件的完整路径名创建新File对象。所以

String name = f.getName(); // gets the name without the directory

应该是:

String name = f.getAbsolutePath();

(您的搜索/替换可能需要更改)

于 2012-08-24T13:30:05.683 回答
2

问题是f.getName()返回由 表示的路径的姓氏部分f。然后你按摩这个字符串并将它变成一个File. 但是Filenow 表示相对于当前目录的路径,而不是包含原始路径的目录。

因此,您的代码实际上是在尝试将文件从dirName应用程序的当前目录重命名。这可能会失败,因为当前目录中已经存在具有这些名称的文件,或者因为dirName和当前目录位于不同的文件系统中。(您不能将文件从一个文件系统重命名到另一个文件系统……您必须复制它。)

请注意,FileJava 中的 a 表示路径名,而不是文件或文件夹。在您的代码中,f对象是由 String 表示的目录中文件系统对象(文件或文件夹)的路径名dirname。这些f对象的每一个都有一个目录部分。


修复代码的方法不止一种;例如

  • 更改name = f.getName()name = f.toString()
  • 更改new File(subbedName)new File(f.getParentFile(), subbedName)

我有一个替代/附加理论。

包含该\uFFFD字符的文件的路径名显示为“mojibake”;即当您使用错误的编码显示编码文本时得到的那种乱码文本。由于我们看到 3 个字符的乱码文本,我怀疑它试图将 UTF-8 渲染显示\uFFFD为 Latin-1。

File.renameTo所以我的理论是,当方法转换f为它将提供给系统调用的形式时,也会发生同样的想法。由于某种我不清楚的原因,Java 可能使用了错误的编码,因此为原始文件生成了一个与文件系统中的文件名不匹配的“名称”。这足以导致重命名失败。

可能相关的问题/链接:

于 2012-08-24T13:30:42.950 回答
1

f.getName();只返回文件夹的名称,而不是完整路径。所以subbedName变成了相对路径文件。尝试一下f.getCanonicalPath()

于 2012-08-24T13:31:18.270 回答