【发布时间】:2017-10-02 04:46:20
【问题描述】:
我目前需要重命名目录中的所有文件。文件不更改名称的可能性很小,而旧文件名与新文件名相同的可能性很大,因此很可能发生重命名冲突。
因此,简单地循环文件并重命名 old->new 不是一种选择。
简单/明显的解决方案是将所有内容重命名为具有临时文件名:old->tempX->new。当然,这在一定程度上改变了问题,因为现在有责任检查旧名称列表中的任何内容都与临时名称列表重叠,并且临时名称列表中的任何内容都与新列表重叠。
此外,由于我正在处理速度慢的媒体和病毒扫描程序,它们喜欢减慢速度,因此我想尽量减少磁盘上的实际操作。除此之外,用户会不耐烦地等待做更多的事情。因此,如果可能的话,我想一次性处理磁盘上的所有文件(通过巧妙地重新排序重命名操作)并避免指数时间的恶作剧。
最后一点给我带来了一个“足够好”的解决方案,我首先在我的目录中创建一个临时目录,然后将所有内容移动重命名到该目录中,最后,我将所有内容移回旧文件夹并删除临时目录。这使我的磁盘和操作复杂度为 O(2n)。
如果可能,我希望将磁盘上的复杂度提高到 O(n),即使它的代价是将内存中的操作增加到 O(99999n)。毕竟内存要快很多。
我个人对图论还不够熟悉,而且我怀疑之前已经解决了整个“重命名冲突”问题,所以我希望有人能指出我的算法可以满足我的需求。 (是的,我可以尝试自己酿造,但我不够聪明,无法编写有效的算法,而且我可能会留下一个逻辑错误,它很少会抬起丑陋的脑袋,以至于无法通过我的测试。xD)
【问题讨论】:
-
是否可以将整个文件结构读入内存,确定内存中的新名称,然后全部写入?
-
我已经在内存中有一个新旧名字的列表,所以这不是问题。内存不是我担心的限制……无论如何,在合理范围内。
标签: algorithm rename graph-theory batch-rename