文件夹名称包含名称c#目录

时间:2016-10-04 09:57:01

标签: c# regex directory filenames

我正在使用Intranet服务器加载Excel加载项。

我有员工的姓名,每个人都有一个内联网文件夹,这个文件夹可能没有电源点文件。所以我需要读取每个名字的文件。

问题在于名称: 每个文件夹名称都有此模式:

  

姓氏,名字

但问题在于名称包含多个名称作为名字或姓氏:

  

例如:   samy jack sammour。   第一个名字是:" samy jack"姓氏是" sammour"

所以文件夹将是:sammour,samy jack

但我只有字段名称,我不知道姓氏或名字是什么(可能是" jack sammour,samy"或者" sammour,samy jack& #34)。所以我尝试了这段代码来修复它:

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

但它给了我一个错误:

  

文件不违法

如何解决此问题并搜索所有可能性

1 个答案:

答案 0 :(得分: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");

在我看来,你应该用正则表达式来做这件事,因为正则表达式不能很好地匹配排列。 相反,您可以创建一个HashSet,其中包含与您的模式相关的所有不区分大小写的排列:

  

姓氏,名字

(区分大小写并不是必需的,因为Windows文件系统并不关心目录或文件名是大写还是小写。)

为了简单起见,我只需将逗号添加到排列部分,然后在下一步中使用逗号过滤以逗号开头或结尾的项目。 如果性能很重要或名称可能包含许多部分,我确信可以更快地优化这些可能性,以防止大部分不必要的排列。

在最后一步中,您枚举目录名称并检查此HashSet中是否存在所有可能名称的匹配项。 当您找到匹配的目录时,您只需要搜索此目录中的所有.pptx文件。 如有必要,只需更换&#34; * .pptx&#34;使用您的文件名模式。