c#从foreach语句中排除文件扩展名

时间:2017-07-14 15:44:24

标签: c# foreach path

我有一个foreach语句,它是此函数的一部分:

try
{
  string pathToFiles = sourceTB.Text;
  DirectoryInfo dirInfo = new DirectoryInfo(pathToFiles);
  int i = 0; 

  foreach (var files in dirInfo.EnumerateFiles())
  {
    //Do stuff here
  }
  MessageBox.Show("Process Successful", "Completed");
}
catch
{
  MessageBox.Show("Process failed", "Failed");
}

我希望能够对其进行编码,以便它能够读取所选文件夹的全部内容(这样可以正常工作),但我正在努力使其能够跳过具有特定文件扩展名的任何文件。

例如,如果文件夹中的每个文件都是.txt文件,我想省略.jpg文件。

我尝试了几种方法来实现这一目标,例如:

var allFilesFromFolder = Directory.GetFiles(pathToFiles);
var filesToExclude = Directory.GetFiles(pathToFiles, "*.jpg");
var filetoInclude = allFilesFromFolder.Except(filesToExclude);

和此:

var files = Directory.GetFiles(pathToFiles).Where(name => !name.EndsWith(".jpg"));

但是这两个都会给代码带来错误,并且在遍历文件时不适合foreach循环。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

您可以准备一个您不想处理的扩展列表,然后在枚举DirectoryInfo.EnumerateFiles返回的FileInfo类时使用该列表

List<string> excluded = new List<string>() {".jpg", ".png"};
foreach (var file in dirInfo.EnumerateFiles().Where(x => !excluded.Contains(x.Extension))
{
   //Do stuff here
}

答案 1 :(得分:0)

您尝试这样做的方式应该可以正常工作,但您也可以在原始代码中包含一个模式,例如,这将为您提供所有文本文件:

foreach (var file in dirInfo.EnumerateFiles("*.txt"))
{
  //Do stuff here
}

另一种方法是保留原始代码,然后放入并检查内部扩展名:

foreach (var file in dirInfo.EnumerateFiles("*.txt"))
{
  if(file.Extension == ".jpg")
    continue;

  //Do stuff here
}