2010-03-03 62 views
2

我有java代码下面的代码片断:为什么一个文件重命名失败在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; 
    } 
}); 

为什么在第一个片段中通过false会成功?

我试着在不同的文件上隔离这个代码,它似乎工作。

回答

5

明显的情况:

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

我想期望那些至少可能失败的人(JavaDoc明确表示这种行为很多取决于操作系统) - 你试过了吗?

+0

您可以编辑自己的帖子没有得到一个“编辑”标志? – Stroboskop 2010-03-03 15:17:34

+0

约翰Skeet可以做任何事情:)感谢乔恩,确实是这个问题...我添加了一个检查存在的目录和一个mkdir,如果它不存在。 – 2010-03-03 15:24:00

+0

@Stroboskop:您可以对答案的前几分钟进行编辑。 – 2010-03-03 15:33:47

0

不要忘记你可能不允许写入/更改/重命名文件。
在Windows中几乎不存在问题,但在Unix环境中很常见。

1

原创不存在? 目标路径上已有文件? Destinatination路径不存在? 源文件只读吗?

只是一些想法

1

我能想到的:

  • 目标目录不存在
  • 没有足够的访问权限(目标目录写保护)目标
  • 没有足够的可用空间目录的数据分区
  • ...
0

要找到它无法正常工作的确切原因,您可以使用System.out.println这些路径,并尝试从操作系统级别移动它们。那会给人一个很好的指示,为什么它不起作用。

2

我发现了这个问题。这是因为我正在复制的目录不存在。

这一周围if语句的工作:

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