为什么File.renameTo(...)不会创建目标子目录?

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())或手动创建所有子目录以确保它们存在。这个方法为什么没有包含这个功能?


可能是因为我不认为那是重命名,我认为那是“移动” :) - Kaj
@Kaj,这是一种方法,但有点虚假,因为你必须显式地创建所有子目录,或者在调用此“便利”方法之前确保它们存在。 - Moonbeam
我知道它的功能: )……但是我不喜欢它的名称,以及其功能受平台限制,而且仅返回一个布尔值作为结果。好吧,关于File类有很多我不喜欢的地方。一开始它应该就是一个接口。 - Kaj
投票怎么了?这里的人真荒谬... - Moonbeam
不知道,而且我认为你的问题并不差。 - Kaj
显示剩余6条评论
4个回答

3

为什么要这样做?

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

可能是因为如果用户并不真正希望创建中间目录,例如他/她只是在路径中输入一个目录名称错误,那么创建这些目录将是一个坏主意。

但这并不重要。底线是,这就是renameTo方法的行为方式。


你找错人了。如果这关乎到你,可以提交一个错误报告。 - Stephen C
2
@Moonbeam:我想这只是你的情况。你的需求非常具体(Windows系统、本地驱动器),而库通常是基于“通用”使用进行定制的。当然,它们不能在标准包/方法中拥有所有功能,对吧?正如先前提到的,如果移动失败,我个人不希望renameTo创建目标目录。当然,他们可以通过传递标志来允许renameTo的行为可配置。但这值得吗?在我看来不值得。当然,你的想法可能不同。 - Sanjay T. Sharma
1
就像我之前说的 - 如果你认为它应该有不同的行为,请提交一个标记为“功能请求”的错误报告。如果你觉得javadoc是不正确/不完整的,请提交一个针对javadoc的错误报告。我不认为你在荒谬,但我认为没有必要争论方法行为的“正确性”。 - Stephen C
也许你应该将你的“期望”调整到计算机工作的方式上,因为这已经有60年了。一个JavaDoc编写者怎么会想到你不知道这个或者期望有所不同呢? - Angel O'Sphere
1
@Moonbeam - 在Java库中实现这个功能同样困难(即不可能)。如果你认为这很容易,请尝试编写renameTo的详细伪代码(例如在单独的答案中),我会为您进行评审。 - Stephen C
显示剩余7条评论

1

创建子目录可能被视为从其他角度出乎意料的副作用。您确定每个人都需要它吗?


我认为这只是一个期望。如果我传递一个目标,我假设它会创建在该文件路径中不存在的任何子目录。如果它可以隐式完成,那么产生的代码将更加清晰。 - Moonbeam

1

Java中当前的文件API实现不是很好。有很多功能在文件API中是必要的,但目前尚未实现,例如移动、复制和检索文件元数据等。

我认为没有人能够告诉你为什么API被编写成这样。可能是一个质量不高的初稿,但已经发布并且由于向后兼容性问题无法更改。

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


0

您已经给出了答案,但我在考虑以下方面:

一个功能请求,添加一个新的方法 File.renameTo(File src, File destination, int makeDirs)

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

  • 如果是没有子文件夹的操作系统,则按照现有方式进行
  • 旧方法将保持不变

不要只是抱怨和猜测,行动起来吧。 - Sukhdev

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