我写了一个非常简单的文件枚举。进度在数学上是连续的,即无论如何它都不会在以后变为较低的值。估计是基于所有文件夹包含相同数量的文件和子文件夹的想法,这显然几乎从不存在,但足以得到一个合理的想法。
几乎没有缓存,尤其是深层结构,所以这应该几乎和直接枚举一样快。
public static IEnumerable<Tuple<string, float>> EnumerateFiles (string root)
{
var files = Directory.GetFiles (root);
var dirs = Directory.GetDirectories (root);
var fact = 1f / (float) (dirs.Length + 1); // this makes for a rough estimate
for (int i = 0; i < files.Length; i++) {
var file = files[i];
var f = (float) i / (float) files.Length;
f *= fact;
yield return new Tuple<string, float> (file, f);
}
for (int i = 0; i < dirs.Length; i++) {
var dir = dirs[i];
foreach (var tuple in EnumerateFiles (dir)) {
var f = tuple.Item2;
f *= fact;
f += (i + 1) * fact;
yield return new Tuple<string, float> (tuple.Item1, f);
}
}
}