2011-12-09 21 views
17

tengo este código:Usando Directory.GetFiles con una expresión regular en C#?

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

Lo que quiero es volver sólo los archivos de los que no comienzan con p_ y t_ y tienen la extensión o png jpg o gif. ¿Cómo haría esto?

+0

echar un vistazo aquí [http://stackoverflow.com/questions/1601241/c-sharp -regex-matching-file-names-according-to-a-specific-naming-pattern] [1] [1]: http://stackoverflow.com/questions/1601241/c-sharp-regex-matching -file-names-according-to-a-specific-naming-pattern – f0rza

+2

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

+0

posible duplicado de [Cómo buscar archivos según RegEx en C#] (http: // stackov erflow.com/questions/2809604/how-to-find-files-according-regex-in-c-sharp) – Christian

Respuesta

45

Directory.GetFiles no soporta RegEx por defecto, lo que puede hacer es filtrar por RegEx en su lista de archivos. Echar un vistazo a este listado:

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

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

Interesante respuesta, pero no encuentro ninguna documentación oficial sobre la sintaxis ';'. ¿Dónde te encontraste con eso? –

+0

muy buen trabajo inteligente! – Mike

+0

¡Gracias! Eso hizo el truco. –

5

No se puede pegar un Regex en el parámetro, es solo un filtro de cadena simple. Intenta usar LINQ para filtrar después en su lugar.

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

probar este código, busca en todas las unidades, así:

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