簡體   English   中英

文件夾名稱包含名稱c#目錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM