在隔离环境中,我使用 .EML 到 .MSG 文件转换器,ReliefJet 必备品,转换大型文件库(数十万个),保持目录结构完整 - 从每个字母的文件夹开始,然后从那里深入。
转换软件不会提供每个完成的文件的日志(谢天谢地),但会保留所有失败的错误日志,这为我提供了它所采用的路线的一些提示。
让我感到困惑的是文件夹没有按字母顺序排列。错误日志报告文件夹按以下顺序转换:
D, N, P, C, I, S, M, G, T, V, B, O, E, Q, A, U, R, F, L
即使子文件夹出现在此列表中,它们的处理顺序也是无序的。例如,在 下B
,文件夹被处理(为保护隐私而截断):
BLA, BD, BRE, BAL, BRA, BEL, BLU
我修正了一些有问题的文件,并再次运行转换请求,跳过现有文件。日志以完全相同的顺序返回所有错误,这让我认为这不是“随机选择”,而是固定顺序。
我想知道的是这个顺序是如何达成的。它似乎不是基于文件夹大小或文件数量,因为两个值都是:
N
小于D
L
大小与D
P
大于N
,D
并L
合并
是否有任何排序方法可以解释为什么该实用程序以这种非字母顺序选择文件夹,这种顺序看似随意,但却可重复和可再现?
答案1
这可能是在磁盘上找到文件和文件夹的顺序。
假设你在磁盘上创建一个文件夹
- 文件夹 J
然后,过了一段时间,你创建了另一个文件夹
- 文件夹 J
- 文件夹 B
是的Folder B
,按字母顺序排列在 J 之前,但是创建时间是在 J 之后。
目录列表就是目录中内容的列表,将项目附加到该列表比读取整个列表、通过某种任意算法对其进行排序然后将列表写回磁盘要简单得多。
就向该目录添加项目而言,如果每次都对其进行排序,则向该目录添加项目的速度会非常慢,实际上,只要向目录中添加大量零字节文件这种简单的操作,就可能会使机器瘫痪,即使文件名是连续的,也必须每次通过排序进行检查。
即使在大型目录中重命名文件也会非常慢,因为它会触发对文件夹的排序操作。
因此,每次只是将一个项目附加到列表中。无需排序,什么也没有。只需附加并关闭。
如果您想要一个已排序的列表,那么您可以扫描目录并对自己的列表进行排序。在该目录的整个生命周期中,如果程序已经对其进行了排序,那么速度可能会更快,但与每次写入或重命名文件时都这样做所带来的性能损失相比,这个问题微不足道。
因此,您可能看到的是目录或文件添加到目录中的顺序,而不是排序列表。
你的程序并不关心“文件管理”。它只关心那些文件的内容,并确保它能遍历列表。
它是随机的,但同时它是可重复的,因为这是将名称写入文件夹列表的顺序。
它看起来随机但实际上并非如此。