2011-12-09 12 views
17

Ho questo codice:Utilizzo di Directory.GetFiles con un'espressione regolare in C#?

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

Quello che voglio è quello di restituire solo i file che non iniziano con p_ e t_ e hanno il png estensione o JPG o GIF. Come lo farei?

+0

un'occhiata qui [http://stackoverflow.com/questions/1601241/c-sharp -regex-matching-file-names-secondo-to-a-a-specifico-naming-pattern] [1] [1]: http://stackoverflow.com/questions/1601241/c-sharp-regex-matching -file-nomi-secondo-uno-specifico-modello di denominazione – f0rza

+2

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

+0

possibile duplicato di [Come trovare i file secondo RegEx in C#] (http: // stackov erflow.com/questions/2809604/how-to-find-files-according-regex-in-c-sharp) – Christian

risposta

45

Directory.GetFiles non supporta RegEx di default, cosa si può fare è quello di filtrare per RegEx sulla vostra lista di file. Date un'occhiata a questa offerta:

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

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

Risposta interessante, ma non riesco a trovare alcuna documentazione ufficiale sulla sintassi ';'. Dove l'hai incontrato? –

+0

bel lavoro molto intelligente! – Mike

+0

Grazie! Questo ha fatto il trucco. –

5

Non è possibile inserire un parametro nel parametro, è solo un semplice filtro stringa. Prova a utilizzare LINQ per filtrare in seguito, invece.

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

provare questo codice, ricerche ogni unità come pure:

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