我想写一个过滤目录中文件的函数。方法接收的路径、文件必须包含的令牌列表以及不应包含在文件中的令牌列表。
我的代码是这样的:
private String[] enumerateFilesByFilter(String path, List<String> contain, List<String> notContain)
{
String[] files = Directory.GetFiles(path).Where(f => (contain.All(f.Contains)) && (!notContain.Any(f.Contains))).ToArray();
//String[] files = Directory.GetFiles(path).Where(f => f.IndexOf(contain.All(f.Contains), 0, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();
return files;
}
我尝试接收符合条件的文件列表,并成功获得正确的列表,但仅针对敏感令牌。
(In推荐你可以看到我试图得到一个不区分大小写,但有一个错误...)
如何检查文件名是否包含列表中的所有字符串(不区分大小写)?
编辑
举个例子假设我的目录中有以下文件:
proj_debug_3.2.0.txt
proj_release_3.2.1.txt
proj_release_3.2.1_useThis_TRY.txt
proj_release_3.2.1_UseThis.txt
所以打电话给
enumerateFilesByFilter(path, new List<String> { "Release", "useThis" }, new List<String> {"try", "debug" });
应返回proj_release_3.2.1_UseThis.txt
文件
3条答案
按热度按时间iq0todco1#
首先,我会为不区分大小写的搜索定义一个新的扩展方法:
然后像这样重写你的方法:
请注意,我使用IEnumerable作为返回类型,使用Directory.EnumerateFiles()作为文件系统列表。这样整个操作就更加高效,并且只使用可枚举。
bpsygsoo2#
这应按预期工作:
请注意,我使用
Directory.EnumerateFiles
而不是Directory.GetFiles
,因为它可以在所有文件返回之前开始处理,而不是GetFiles
,它首先创建所有文件的数组。也许你还应该考虑使用
System.IO.Path.GetFileName(f)
只检查文件名而不是完整路径。qvsjd97n3#
最后,我找到了解决方案(解决方案很丑,但有效):