【发布时间】:2020-11-25 13:38:27
【问题描述】:
我使用此函数遍历目录中的所有文件,并仅在每个文件具有特定扩展名时为每个文件执行代码,例如示例中的 .txt。我也排除了以 .png 结尾的那些。
foreach (string file in Directory.EnumerateFiles(rootDir).Where(
f => (f.ToLower().EndsWith(".txt")) //Include
&& !(f.ToLower().EndsWith(".png")) //Exclude
).ToList())
{
//Do something
}
这段代码运行良好,但如果我必须处理几个扩展怎么办?
我会一遍又一遍地将每个编写相同行代码的扩展程序列入白名单/黑名单。
我确信存在一种聪明的方法。 一个想法是将所有想要的和不需要的扩展名存储在一个数组中。
为了做到这一点,如何改进上面的代码?
【问题讨论】:
-
在循环外创建白名单或黑名单扩展字符串的集合。在文件名上使用
System.IO.Path.GetExtension以获取扩展名,并与集合上的 Contains 结合使用。我希望这将为您提供足够的信息,以便您可以自行构建解决方案。 -
如果
f.ToLower().EndsWith(".txt")为真 - 您无需检查f.ToLower().EndsWith(".png")(它始终为假) -
另外,您的所有代码都可以替换为
foreach (var file in Directory.EnumerateFiles(rootDir, "*.txt")) { /* Do something */ } -
您应该只需要检查您想要包含的文件,其他任何内容都会被自动排除。今天较早的问题中有一个示例,可能对多个扩展有所帮助:stackoverflow.com/questions/63262750/…
-
同时拥有白名单和黑名单对我来说没有意义。这就像说你“包括男孩,但不包括女孩”——这是多余的。你真正想做什么?