2012-06-05 8 views
6
string fileName = ""; 

      string sourcePath = @"C:\vish"; 
      string targetPath = @"C:\SR"; 

      string sourceFile = System.IO.Path.Combine(sourcePath, fileName); 
      string destFile = System.IO.Path.Combine(targetPath, fileName); 

      string pattern = @"23456780"; 
      var matches = Directory.GetFiles(@"c:\vish") 
       .Where(path => Regex.Match(path, pattern).Success); 

      foreach (string file in matches) 
      { 
       Console.WriteLine(file); 
       fileName = System.IO.Path.GetFileName(file); 
       Console.WriteLine(fileName); 
       destFile = System.IO.Path.Combine(targetPath, fileName); 
       System.IO.File.Copy(file, destFile, true); 

      } 

Mi programa anterior funciona bien con un solo patrón.Buscar archivos con patrones coincidentes en un directorio C#?

Estoy utilizando el programa anterior para buscar los archivos en un directorio con un patrón coincidente, pero en mi caso tengo varios patrones, así que tengo que pasar varios patrones en la variable string pattern como una matriz, pero no tengo ninguno idea de cómo puedo manipular esos patrones en Regex.Match.

¿Alguien me puede ayudar?

Respuesta

9

Usted puede poner O en el expresiones regulares:

string pattern = @"(23456780|otherpatt)"; 
+0

tipo perfecto, thankss! –

1

En la forma más simple que puede hacer por ejemplo

string pattern = @"(23456780|abc|\.doc$)"; 

esto coincidirá con los archivos de poco con su patrón elegido o la archivos con patrón abc o los archivos con extensión .doc

Una referencia para los patrones av ailable para la clase Regex podría ser found here

4

cambio

.Where(path => Regex.Match(path, pattern).Success); 

a

.Where(path => patterns.Any(pattern => Regex.Match(path, pattern).Success)); 

patrones donde es un IEnumerable<string>, por ejemplo:

string[] patterns = { "123", "456", "789" }; 

Si usted tiene más de 15 expresiones en la matriz, es posible que desee aumentar el tamaño de la memoria caché:

Regex.CacheSize = Math.Max(Regex.CacheSize, patterns.Length); 

ver http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.cachesize.aspx para obtener más información. respuesta

+0

Debe ser 'Regex.Match (System.IO.File.GetFileName (ruta), patrón)' ya que 'GetFileNames' devuelve rutas completas. –

2

de Aleroot es la mejor, pero si desea hacerlo en su código, también podría hacerlo de esta manera:

string[] patterns = new string[] { "23456780", "anotherpattern"}; 
     var matches = patterns.SelectMany(pat => Directory.GetFiles(@"c:\vish") 
      .Where(path => Regex.Match(path, pat).Success)); 
+0

Esto es muy ineficiente, ya que la llamada a Directory.GetFiles() se ejecutará una vez por patrón. Sería mejor si invierte las operaciones: Directory.GetFiles (...). SelectMany (file => patterns) ... Pero ambos devolverán el mismo archivo dos veces si coincide con dos de las expresiones . Ver mi respuesta para una solución que no hace eso, y es aún más eficiente como resultado (dejará de coincidir tan pronto como coincida un patrón) –

+0

De hecho, y hacerlo con la expresión regular es de lejos la mejor solución, ya que ya mencionado :) – Nathan

Cuestiones relacionadas