2012-04-04 5 views
3

"c : \ Users"의 창에서 사용자 폴더 목록을 반복하면서 Microsoft 기본 제공 사용자 폴더를 제외하려고합니다. 아래 코드는 사용중인 코드 세그먼트입니다. 이 위업을 달성하기 위해 그러나 그것은 의도 한대로 작동하지 않는 어떤 이유 때문입니다.C# Directory.GetDirectories including 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"일치가 있는지 확인하면 특정 가장자리의 경우 잘못된 결과가 나타납니다. –

6

Directory.GetDirectories을() 디렉토리의 전체 경로, 디렉토리의 단지 마지막 부분을 반환합니다.

GetDirectories()가 반환 한 경로의 마지막 구성 요소를 제거하고 현재 배열에있는 것과 비교하면 false positive와 false negative가 발생합니다.

대신 현재 사용자 및 운영 체제 버전에 특정한 특정 폴더의 경로를 가져 오려면 Environment.SpecialFolders을 사용하십시오.

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