【问题标题】:C# - Visiting only specific files in a directoryC# - 仅访问目录中的特定文件
【发布时间】: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/…
  • 同时拥有白名单和黑名单对我来说没有意义。这就像说你“包括男孩,但不包括女孩”——这是多余的。你真正想做什么?

标签: c# arrays string file


【解决方案1】:

你可以这样做:

var whiteList = new List<string>{".txt"};
var blackList = new List<string>{".png"};

foreach (string file in 
            Directory
            .EnumerateFiles(rootDir)
            .Where(
                f => whiteList.Any(ext => (f.ToLower().EndsWith(ext))  //Either use a white list
                //f => !(blackList.Any(ext => (f.ToLower().EndsWith(ext))) //Or use a black list
            ).ToList())
            

【讨论】:

  • 虽然这可行,但同时拥有一个白名单和一个黑名单是没有意义的。如果有的话,这应该是两种不同的方法,一种用于白名单,一种用于黑名单。 (如果文件与白名单中的某个范围不匹配,它将无法通过白名单检查,因此永远不会与黑名单进行比较。)
  • 你是对的,只有白名单部分就足够了。您可以将想要的项目列入白名单,也可以将不想要的项目列入黑名单,两者都行不通。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多