【问题标题】:Renaming directory and some of the containing files/subdirectories重命名目录和一些包含文件/子目录
【发布时间】:2011-12-12 14:30:47
【问题描述】:
我最近正在制作一些 Java 软件来查找文件夹中的一些文件/目录,如果它们的名称包含某些文本,它们将被重命名为其他名称。我使用Files.walkFileTree 遍历目录,如果找到一个匹配的文件/目录,它将使用File.renameTo 方法重命名。
但是这里我遇到了一个问题,如果一个子目录被重命名了,这个子目录下的所有重命名操作都会失败。
我认为这是由于该子目录已被标记为打开,因此无法对其文件/文件夹进行更改。有什么办法解决吗?
【问题讨论】:
标签:
java
file-io
file-rename
【解决方案1】:
如果首先确定所有名称,然后在重命名目录包含的文件之前重命名目录,则会发生这种情况。
有几个方法是先重命名文件深度(仅在重命名文件后重命名目录)或仅在执行过程中构建文件列表。
【解决方案2】:
这可以通过将目录从“最底层的第一个到最顶层的最后一个”重命名来解决。
【解决方案3】:
恐怕这就是walkFileTree 的语义。 NIO 2 的技术负责人 Alan Bateman 表示:
walkFileTree 实用方法是一个内部迭代器,它利用
从目录流中获得的迭代器。这些迭代器是
(在 DirectoryStream 中)指定为“弱一致”并且可能不会
打开目录后反映对目录的更新。 ...
无论如何,差异的原因是底层实现
很不一样。