簡體   English   中英

在 C# 中使用帶有正則表達式的 Directory.GetFiles?

[英]Using Directory.GetFiles with a regex in C#?

我有這段代碼:

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

我想要的是僅返回不以p_t_開頭且擴展名為 png 或 jpg 或 gif 的文件。 我該怎么做?

Directory.GetFiles默認情況下不支持RegEx ,您可以做的是在文件列表上按RegEx過濾。 看看這個清單:

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

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

你不能將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)

試試這段代碼,搜索每個雲端硬盤:

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");
        }
      }
    }
  }
}

我剛遇到這個,這就是我的處理方式。 它在 VB.net 中,但它應該很容易移植到 C#。

我需要處理以“king-”開頭的文件夾中的圖像。 但是,有很多文件名和模式,所以我最容易解析所有這些並將正則表達式作為字符串進行匹配。 我按字母順序對它們進行排序,因為如果我這樣做,我需要做的事情效果最好。

結果是您在枚舉文件本身時使用正則表達式,而不是嘗試將其用作參數。

    Dim imgPath As String = Server.MapPath("~/images/")
    Dim imgDir As New System.IO.DirectoryInfo(imgPath)
    Dim RegexPath As String = "king-(.*)-count-\d{1,}\.jpg"
    Dim RegX As New Regex(RegexPath)
    Dim kingPics As List(Of String) = imgDir.EnumerateFiles("king-*.*").Select(Function(f) f.Name).ToList()
    For Each pic As String In kingPics
        Dim isMatch As Boolean = RegX.IsMatch(pic)
        If isMatch Then
            ' I did my matching work here.
        End If
    Next

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM