2016-10-04 245 views
0

我正在使用Intranet服務器的Excel加載項。文件夾名稱包含名稱c#目錄

我有僱員的名字,每個人都有一個文件夾在內聯網和這個文件夾可能有一個電源點文件可能沒有。所以我需要讀取每個名稱的文件。

問題是名稱: 每個文件夾名稱具有以下模式:

surname, firstname

,但問題是誰包含多個名字作爲名字或姓氏的名字:

ex: samy jack sammour. the first name is: "samy jack" and the last name is "sammour"

所以該文件夾將是:sammour,samy jack

但我只有字段名稱,我不知道什麼是姓氏或名字(它可能是「j ack sammour,samy「或」sammour,samy jack「)。所以我想這個代碼來解決這個問題:

string[] dirs = System.IO.Directory.GetFiles(@"/samy*jack*sammour/","*file*.pptx"); 
if (dirs.Length > 0) 
{ 
    MessageBox.Show("true"); 
} 

,但它給了我一個錯誤:

file is not illegal

我怎麼能解決這個問題,並搜索所有possibilties

+1

最好的方法是讓所有帶有\ *。\ *的文件放入列表。然後使用Linq在List <>上進行過濾/搜索。 – jdweng

+0

也許'[a-z \ s,] +'?.. –

回答

1

這應該做的伎倆:

var path = @"C:\Users\"; 
var name = "samy jack sammour"; 

Func<IEnumerable<string>, IEnumerable<string>> permutate = null; 
permutate = items => 
    items.Count() > 1 ? 
     items.SelectMany(
      (_, ndx1) => permutate(items.Where((__, ndx2) => ndx1 != ndx2)), 
      (item1, item2) => item1 + (item2.StartsWith(",") ? "" : " ") + item2) : 
     items; 

var names = name.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Concat(new[] { "," }).ToArray(); 
var dirs = new HashSet<string>(permutate(names).Where(n => !n.StartsWith(",") && !n.EndsWith(",")), StringComparer.OrdinalIgnoreCase); 
if (new DirectoryInfo(path).EnumerateDirectories().Any(dir => dirs.Contains(dir.Name) && dir.EnumerateFiles("*.pptx").Any())) 
    MessageBox.Show("true"); 

在我看來,你should't用正則表達式做到這一點,因爲正則表達式不能非常相配排列 好。 相反,你可以創建一個包含所有不區分大小寫的排列是關聯到您的模式HashSet的:

surname, firstname

(因爲Windows文件系統不一樣,如果一個目錄或文件名關心區分大小寫不要求是大寫還是小寫)

爲了簡單起見,我只是將逗號添加到置換部分,並在下一步中用逗號過濾開始或結束的項目。 如果性能很重要,或者名稱可能包含很多部分,我相信有一種方法可以儘早優化這些可能性,以防止大部分不必要的排列。

在最後一步中,列舉目錄名稱並檢查此HashSet中是否存在所有可能名稱的匹配項。 當您找到一個匹配的目錄時,您只需要搜索此目錄中的所有.pptx文件。 如果需要,只需用您的文件名稱模式替換「* .pptx」即可。

+0

是的,但是爲什麼?儘管這段代碼可以解決這個問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –

相關問題