2011-08-16 37 views
1

我是Java獸醫,但是.NET新手。我需要按類型和C#中的總數收集文件的總大小和數量。有沒有比遞歸搜索更好的方法?另外,我需要找到多種類型。 HashTable會適合加載我的擴展和更新嗎?在C#中按文件類型劃分的文件的總大小和數量

void DirSearch(string sDir) 
{ 
try 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
    FileInfo[] fiArr = d.GetFiles(); 
    foreach (string f in fiArr) 
    { 
     String ext = Path.GetExtension(f.Name); 
     if (myht.ContainsKey(ext) 
     { 
     myht[ext] = myht[ext] + f.Length; 
     } 
    } 
    DirSearch(d); 
    } 
} 
catch (System.Exception excpt) 
{ 
    Console.WriteLine(excpt.Message); 
} 
} 
+0

「你好」的意思是什麼? – Mehrdad

+0

我應該說更快。 – traigo

回答

0

的一般方法已被@Slaks概述 - 因爲你確實需要支持一組不同的文件擴展名,但並希望得到的統計數據可能會更好寫自定義方法,所以你只需要遍歷目錄樹一次。

而不是使用遞歸調用,您可以只使用一個堆棧來表達遞歸,下面只是返回基於擴展的枚舉匹配的文件列表的例子 - 你可以很容易地修改此爲您的方案:

public static List<string> DirSearch(string startDirectory, IEnumerable<string> extensions) 
{ 
    Stack<string> directoryStack = new Stack<string>(); 
    List<string> files = new List<string>(); 

    directoryStack.Push(startDirectory); 
    while (directoryStack.Count > 0) 
    { 
     string currentDirectory = directoryStack.Pop(); 
     DirectoryInfo di = new DirectoryInfo(currentDirectory); 
     files.AddRange(di.EnumerateFiles() 
         .Where(f => extensions.Contains(f.Extension)) 
         .Select(f => f.FullName)); 
     foreach (string directory in Directory.GetDirectories(currentDirectory)) 
      directoryStack.Push(directory); 
    } 
    return files; 
} 
+0

對於看到這個的任何人的重要提示:f.Extension返回擴展名,包括點。我的人生有30分鐘。 – traigo

+0

你可以使用'SearchOption.AllDirectories' – SLaks

1

你應該叫Directory.EnumerateFiles(sDir, SearchOption.AllDirectories)

+0

看起來像它不支持多個過濾器。我會爲每個擴展運行這個嗎? – traigo

相關問題