为什么File.renameTo(...)没有创建目标的子目录?

时间:2011-07-25 13:49:52

标签: java file-rename

为什么File.renameTo(...)没有创建目标文件路径中包含的子目录?


例如,

File source = new File(System.getProperty("user.dir") + 
                "/src/MyFolder/MyZipFolder.zip");
File dest = new File(System.getProperty("user.dir") + 
                "/src/MyOtherFolder/MyZipFolder.zip");
System.out.println(source.renameTo(dest));

由于MyOtherFolder不存在,因此始终返回false。为了实现这一点,我必须通过以编程方式(即mkdirs())或手动创建所有子目录来确保它们存在。这个方法中没有包含此功能的原因是什么?

4 个答案:

答案 0 :(得分:3)

为什么?

可能与典型操作系统和其他编程语言运行时库提供的API保持一致/兼容。

可能因为如果用户并不真的意味着要发生中间目录,那么创建中间目录是个坏主意;例如如果他/她只是错误地输入了路径中的一个目录名。

但它并不真正相关。最重要的是,这是renameTo方法的行为方式。

答案 1 :(得分:1)

从其他角度来看,创建子目录可能被视为意外的副作用。你确定每个人都需要它吗?

答案 2 :(得分:1)

目前的File API在Java中实现得不是很好。在当前不存在的文件API中存在许多功能,例如移动,复制和检索文件元数据。

我认为没有人能够回答为什么API按原样编写。可能是一个糟糕的初稿,由于向后兼容性问题而上线并且无法更改。

这些问题已在即将发布的Java 7中得到解决。已经创建了一个全新的API来处理文件java.nio.file.Files

答案 3 :(得分:0)

你有答案,但我在思考: 添加新方法的功能请求File.renameTo(File src,File destination,int makeDirs)

有三个常量用于makeDirs: 1)不要制作子文件夹/目录 2)只有最终文件夹不存在意味着如果你指定/r1/r2/r3/file.extn然后只有r3如果它不存在,如果r2或任何其他不存在则返回false。 3)制作所有可能的子目录

  • 如果它的操作系统没有子文件夹,那么就像现在这样做
  • 旧方法将保持原样