[英]folder name contain names c# Directory
我正在使用帶有Intranet服務器的Excel加載項。
我有員工的姓名,每個人在Intranet中都有一個文件夾,並且此文件夾中可能有一個Power Point文件,但可能沒有。 所以我需要閱讀每個名稱的文件。
問題在於名稱:每個文件夾名稱都具有以下模式:
姓,名
但是問題在於包含多個名字或姓氏的名字:
例如:samy jack sammour。 名字是:“ samy jack”,名字是“ sammour”
因此文件夾將是:sammour,samy jack
但是我只有字段名,不知道姓或名(可以是“ sammour,samy”或“ sammour,samy jack”)。 所以我嘗試使用以下代碼對其進行修復:
string[] dirs = System.IO.Directory.GetFiles(@"/samy*jack*sammour/","*file*.pptx");
if (dirs.Length > 0)
{
MessageBox.Show("true");
}
但這給了我一個錯誤:
文件不合法
我該如何解決此問題並搜索所有可能性
這應該夠了吧:
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");
我認為,您不應該使用正則表達式來執行此操作,因為正則表達式不能很好地匹配排列。 相反,您可以創建一個HashSet,其中包含與模式相關的所有不區分大小寫的排列:
姓,名
(因為Windows文件系統不在乎目錄名或文件名是大寫還是小寫,所以不需要區分大小寫。)
為了簡單起見,我只將逗號添加到排列部分,然后在下一步中過濾以逗號開頭或結尾的項目。 如果性能很重要,或者名稱可以由很多部分組成,我敢肯定,有一種方法可以盡早優化這些可能性,以防止大部分不必要的排列。
在最后一步中,您將枚舉目錄名稱,並檢查此HashSet中所有可能的名稱是否匹配。 找到匹配的目錄后,您只需搜索該目錄中的所有.pptx文件。 如有必要,只需用文件名模式替換“ * .pptx”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.