我最近制作了一些Java软件来查找文件夹中的某些文件/目录,如果它们的名称包含某些文本,它们将被重命名为其他名称。我使用Files.walkFileTree
遍历目录,如果找到一个匹配的文件/目录,将使用File.renameTo
方法重命名。
但是如果重命名了一个子目录,我遇到了一个问题,这个子目录下的所有重命名操作都将失败。
我认为这是因为此子目录已标记为打开,因此无法对其文件/文件夹进行任何更改。有什么想法解决这个问题吗?
答案 0 :(得分:3)
如果首先确定所有名称,然后在重命名目录之前重命名目录,则会发生这种情况。
其中一个问题是首先重命名文件深度(仅在重命名文件后重命名目录)或者只是在你去的时候构建文件列表。
答案 1 :(得分:1)
这可以通过将目录从“最下面的第一个”重命名为“最后一个”来解决。
答案 2 :(得分:0)
我担心walkFileTree
的语义应该是什么。 NIO 2的技术负责人Alan Bateman说:
walkFileTree实用程序方法是一个使用的内部迭代器 从目录流中获取的迭代器。这些迭代器是 指定(在DirectoryStream中)是“弱一致”,可能不是 在打开目录后反映目录的更新。 ... 无论如何,差异的原因在于底层实现 是非常不同的。