2012-04-04 112 views
3

我試圖遍歷「c:\ Users」窗口中的用戶文件夾列表,但排除了微軟內置的用戶文件夾,下面是我正在使用的代碼段要完成這個壯舉,但由於某種原因,不能按預期工作。c#Directory.GetDirectories不包括文件夾

private readonly List<String> _exclusion = new List<String> 
                { 
                 "All Users", 
                 "Default", 
                 "LocalService", 
                 "Public", 
                 "Administrator", 
                 "Default User", 
                 "NetworkService" 
                }; 

public static bool FoundInArray(List<string> arr, string target) 
{ 
    return arr.Exists(p => p.Trim() == target); 
} 

foreach (string d in Directory.GetDirectories(sDir).Where(d => !FoundInArray(_exclusion,d))) 
{ 
    richTextBox1.Text += d + Environment.Newline; 
} 

我不知道爲什麼,這是行不通的,任何人都可以給我提供一些這方面的見解?

+0

使用調試器並放置一個斷點。然後在查看變量的源代碼中迭代。告訴我們哪個部分不能按預期工作,取而代之的是什麼結果。 – surfen 2012-04-04 00:43:45

回答

2

在你的lambda表達式中:'d'是目錄的完整名稱(帶有路徑),因此實際上並不在數組中。

你可以這樣做:

public static bool FoundInArray(List<string> arr, string target) 
{ 
    return arr.Any(p => new DirectoryInfo(target).Name == p); 
} 
+0

你知道我該如何返回DirectoryInfo d.Name嗎? – Clu 2012-04-04 00:46:51

+0

new DirectoryInfo(d).Name – SimpleVar 2012-04-04 00:47:31

+0

檢查字符串上的「包含」匹配將在某些邊緣情況下產生錯誤結果。 – 2012-04-04 00:51:03

6

Directory.GetDirectories()返回目錄的完整路徑,而不僅僅是目錄的最後一部分。

雖然您可能會剝離GetDirectories()返回的路徑的最後一個組件,並將其與數組中的當前內容進行比較,但這會導致誤報和漏報。

而是使用Environment.SpecialFolders獲取特定於當前用戶和操作系統版本的給定特殊文件夾的路徑。

private readonly List<String> _exclusion = new List<String> 
{ 
    Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), 
    // etc. 
}