2011-12-09 15 views
17

mam ten kod:Korzystanie z pliku Directory.GetFiles z wyrażeniem regularnym w języku C#?

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

co chcę wrócić tylko te pliki, które nie zaczynają się p_ i t_ i mają rozszerzenie png lub jpg lub gif. Jak to zrobić?

+0

spojrzeć tutaj [http://stackoverflow.com/questions/1601241/c-sharp -regex-pasujące-nazwy-plików-według-do-określonego-wzorca-nazwy] [1] [1]: http://stackoverflow.com/questions/1601241/c-sharp-regex-matching -file-names-based-to-a-specific-nazing-pattern – f0rza

+2

@ f0rza, '[link] (http: // url)' ;-) – Qtax

+0

możliwy duplikat [Jak znaleźć pliki zgodnie z RegEx w C#] (http: // stackov erflow.com/questions/2809604/how-to- find-files-according-regex-in-c-sharp) – Christian

Odpowiedz

45

Directory.GetFiles nie obsługuje RegEx domyślnie, co można zrobić, to aby filtrować według RegEx na liście plików. Spojrzeć na szczegóły:

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

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

Interesująca odpowiedź, ale nie mogę znaleźć żadnej oficjalnej dokumentacji na temat składni ';'. Gdzie się z tym spotkałeś? –

+0

bardzo sprytna miła robota! – Mike

+0

Dziękujemy! To wystarczyło. –

5

Nie można przykleić Regex do parametru, to tylko prosty filtr ciąg. Zamiast tego spróbuj użyć LINQ do odfiltrowania.

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

Spróbuj tego kodu, przeszukuje każdy dysk tak dobrze:

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"); 
     } 
     } 
    } 
    } 
} 
Powiązane problemy