4

为什么不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

4 回答 4

3

为什么?

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

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

但这并不重要。最重要的是,这是该renameTo方法的行为方式。

于 2011-07-25T14:01:54.607 回答
1

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

于 2011-07-25T14:00:55.170 回答
1

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

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

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

于 2011-07-25T15:24:57.207 回答
0

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

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

  • 如果它的操作系统没有子文件夹,那么就像你现在做的那样
  • 旧方法将保持原样
于 2013-04-23T07:12:26.360 回答