【问题标题】:folder name contain names c# Directory文件夹名称包含名称 c# 目录
【发布时间】:2016-10-04 09:57:01
【问题描述】:

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

我有员工的姓名,每个员工在内网都有一个文件夹,这个文件夹可能有一个 power point 文件,可能没有。所以我需要阅读每个名称的文件。

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

姓,名

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

例如: 萨米杰克萨摩。 名字是:“samy jack”,姓氏是“sammour”

所以文件夹是:sammour, samy jack

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

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

但它给了我一个错误:

文件不违法

我怎样才能解决这个问题并搜索所有的可能性

【问题讨论】:

  • 最好的方法是获取所有带有 *.* 的文件并放入 List。然后使用 Linq 对 List. 进行过滤/搜索

标签: c# regex directory filenames


【解决方案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 文件。 如有必要,只需将“*.pptx”替换为您的文件名模式。

【讨论】:

  • 是的,但为什么呢?虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2016-11-02
  • 2012-10-21
  • 2013-08-26
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多