2012-04-04 6 views
3

"c:\ Users"のウィンドウでユーザーフォルダの一覧を繰り返し処理しますが、Microsoftの組み込みユーザーフォルダは除外します。使用しているコードセグメントは以下のとおりですこの偉業を達成するためには、それは何らかの理由で意図的に動作していないからです。c#Directory.GetDirectories without folders

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

答えて

2

ラムダ式では、「d」はディレクトリの完全な名前であり、実際には配列内にはありません。あなたが行うことができ

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

DirectoryInfo d.Nameをどうやって返すのか知っていますか? – Clu

+0

新しいDirectoryInfo(d).Name – SimpleVar

+0

文字列に "contains"が含まれているかどうかを確認すると、特定のエッジのケースではfalseの結果が返されます。 –

6

Directory.GetDirectories()は、ディレクトリの最後の部分だけではなく、ディレクトリのフルパスを返します。

GetDirectories()によって返されたパスの最後のコンポーネントを取り除いて現在の配列と比較すると、誤検出と偽陰性が発生します。

代わりに、Environment.SpecialFoldersを使用して、現在のユーザーとオペレーティングシステムのバージョンに固有の特別なフォルダのパスを取得します。

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