在C#中使用带有正则表达式的Directory.GetFiles?

时间:2011-12-09 09:34:40

标签: c# regex file

我有这段代码:

string[] files = Directory.GetFiles(path, "......", SearchOption.AllDirectories)

我想要的只是返回不以p_t_开头且扩展名为png或jpg或gif的文件。我该怎么做?

3 个答案:

答案 0 :(得分:64)

默认情况下,

Directory.GetFiles不支持RegEx,您可以在文件列表中按RegEx进行过滤。看看这个清单:

Regex reg = new Regex(@"^^(?!p_|t_).*");

var files = Directory.GetFiles(yourPath, "*.png; *.jpg; *.gif")
                     .Where(path => reg.IsMatch(path))
                     .ToList();

答案 1 :(得分:8)

你不能将Regex粘贴到参数中,它只是一个简单的字符串过滤器。尝试使用LINQ来过滤掉。

var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".jpg") || s.EndsWith(".png"))
            .Where(s => s.StartsWith("p_") == false && s.StartsWith("t_") == false)

答案 2 :(得分:2)

尝试使用此代码,同时搜索每个云端硬盘:

DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
  if (drive.RootDirectory.Exists)
  {
    DirectoryInfo darr = new DirectoryInfo(drive.RootDirectory.FullName);
    DirectoryInfo[] ddarr = darr.GetDirectories();
    foreach (DirectoryInfo dddarr in ddarr)
    {
      if (dddarr.Exists)
      {
        try
        {
          Regex regx = new Regex(@"^(?!p_|t_)");
          FileInfo[] f = dddarr.GetFiles().Where(path => regx.IsMatch(path));
          List<FileInfo> myFiles = new List<FileInfo>();
          foreach (FileInfo ff in f)
          {
            if (ff.Extension == "*.png " || ff.Extension == "*.jpg")
            {
              myFiles.Add(ff);
              Console.WriteLine("File: {0}", ff.FullName);
              Console.WriteLine("FileType: {0}", ff.Extension);
            }
          }
        }
        catch
        {
          Console.WriteLine("File: {0}", "Denied");
        }
      }
    }
  }
}