Я написал довольно простое перечисление файлов. Прогресс математически непрерывен, то есть он не станет более низким значением позже, несмотря ни на что. Оценка основана на идее, что все папки содержат одинаковое количество файлов и подпапок, что, очевидно, почти никогда не имеет место, но этого достаточно для получения разумного представления.
Кэширования почти нет, особенно не глубоких структур, поэтому это должно работать почти так же быстро, как и непосредственное перечисление.
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);
}
}
}