我正在使用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");
}
但它给了我一个错误:
文件不违法
如何解决此问题并搜索所有可能性
答案 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;使用您的文件名模式。