我寫了一個非常簡單的枚舉文件。這一進展在數學上是連續的,即不管什麼時候它都不會變成較低的值。估計是基於這樣的想法,即所有文件夾都擁有相同數量的文件和子文件夾,這顯然幾乎從未如此,但只需獲得合理的想法即可。
幾乎沒有緩存,尤其是深層結構,所以這應該幾乎和直接枚舉一樣快。
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);
}
}
}
謝謝 - 這正是我的想法。如果我找不到任何其他選項(以任何魔術方式從某個神奇的地方快速拉出數字),我會選擇這種方法。 – Alex
亞歷克斯:文件系統不存儲你想要的信息,所以唯一的方法就是掃描。 – Gabe