2016-10-04 238 views
0

我正在使用Intranet服务器的Excel加载项。文件夹名称包含名称c#目录

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

问题是名称: 每个文件夹名称具有以下模式:

surname, firstname

,但问题是谁包含多个名字作为名字或姓氏的名字:

ex: samy jack sammour. the first name is: "samy jack" and the last name is "sammour"

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

但我只有字段名称,我不知道什么是姓氏或名字(它可能是“j ack sammour,samy“或”sammour,samy jack“)。所以我想这个代码来解决这个问题:

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

,但它给了我一个错误:

file is not illegal

我怎么能解决这个问题,并搜索所有possibilties

+1

最好的方法是让所有带有\ *。\ *的文件放入列表。然后使用Linq在List <>上进行过滤/搜索。 – jdweng

+0

也许'[a-z \ s,] +'?.. –

回答

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"); 

在我看来,你should't用正则表达式做到这一点,因为正则表达式不能非常相配排列 好。 相反,你可以创建一个包含所有不区分大小写的排列是关联到您的模式HashSet的:

surname, firstname

(因为Windows文件系统不一样,如果一个目录或文件名关心区分大小写不要求是大写还是小写)

为了简单起见,我只是将逗号添加到置换部分,并在下一步中用逗号过滤开始或结束的项目。 如果性能很重要,或者名称可能包含很多部分,我相信有一种方法可以尽早优化这些可能性,以防止大部分不必要的排列。

在最后一步中,列举目录名称并检查此HashSet中是否存在所有可能名称的匹配项。 当您找到一个匹配的目录时,您只需要搜索此目录中的所有.pptx文件。 如果需要,只需用您的文件名称模式替换“* .pptx”即可。

+0

是的,但是为什么?尽管这段代码可以解决这个问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 –

相关问题