为什么Java中的文件重命名会失败

3

我有以下Java代码片段:

File directoryToMoveTo = new File(file.getParent()+"_TEMP");
boolean success = file.renameTo(new File(directoryToMoveTo,file.getName()));
if (!success){
    logger.warn("Failed to move [%s] to temp Directory.");
}

文件作为参数传递给该方法,并且是通过以下方式获取的文件数组之一:

File[] files = directory.listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        logger.debug(String.format("Testing file [%s]",name));
        boolean passed = name.endsWith(getFileDescription().getFilePattern());
        logger.debug(String.format("Passed [%s]",passed));
        return passed;
    }
});

为什么第一个片段会出现假成功的情况?

我在另一个文件中尝试了这段代码,它似乎是有效的。

7个回答

6

明显的情况:

  • 目标文件已经存在
  • 目标目录不存在
  • 目标目录位于不同的文件系统
  • 目标目录是只读的(或者至少当前用户没有写入权限)

我认为这些情况至少有可能会失败(JavaDoc明确表示很多此行为取决于操作系统)- 你尝试过吗?


1
John Skeet 可以做任何事情 :) 谢谢 Jon,的确是这个问题... 我添加了一个检查目录是否存在和创建目录的代码。 - Omar Kooheji
@Stroboskop:你可以在回答发布的前几分钟内进行编辑。 - Jon Skeet
@JonSkeet 如何在本地Java方法中调试此类问题? - Gaurav
@gaurav:这里的“native”具体指什么?是被JNI调用的函数,还是内置的Java代码?我真的不确定你在问什么样的情况——最好你提出一个新问题,并提供更多详细信息。 - Jon Skeet
@JonSkeet WinNTFileSystem类有一个名为rename0()的本地方法;它返回false,我想知道它为什么会返回false? - Gaurav
显示剩余2条评论

3

我找到了问题所在。原因是我复制的目录不存在。

用这个if语句包围起来就可以解决:

if (directoryToMoveTo.exists() || directoryToMoveTo.mkdir()){ }

如何在本地Java方法中调试此类问题? - Gaurav

1

原文件不存在? 目标路径已存在相同文件? 目标路径不存在? 源文件只读?

以上是一些可能出现的情况。


1
我能想到的有:
  • 目标目录不存在
  • 没有足够的访问权限(目标目录受写保护)
  • 目标目录数据分区上没有足够的可用空间
  • ...

1

0

别忘了,你可能没有权限写入/更改/重命名文件。
在Windows中几乎从不出现问题,但在Unix环境中很常见。


0
为了找到它不工作的确切原因,您可以System.out.println这些路径,并尝试从操作系统级别移动它们。这将给出为什么它不起作用的良好指示。

如何调试本地Java方法中出现的问题? - Gaurav

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