2012-06-05 12 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); 

      } 

Mój powyższy program działa dobrze z jednym wzorem.Znajdź pliki z pasującymi wzorcami w katalogu C#?

Używam powyższego programu do znajdowania plików w katalogu z pasującym wzorcem, ale w moim przypadku mam wiele wzorców, więc muszę przekazać wiele wzorca w zmiennej string pattern jako tablicy, ale nie mam żadnych pomysł jak mogę manipulować tymi wzorami w Regex.Match.

Czy ktoś może mi pomóc?

Odpowiedz

9

Można położyć LUB w regex:

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

idealny Koleś, thankss! –

1

W najprostszej postaci można zrobić na przykład

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

ten będzie pasował do plików pokojowe swojej strukturze wybranej wersji Lub pliki o wzorze abc lub pliki o rozszerzeniu .doc

Odsyłacz do wzorców av ailable dla klasy Regex mogłaby być found here

4

zmiana

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

do

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

gdzie wzorce jest IEnumerable<string>, na przykład:

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

Jeśli masz więcej niż 15 wyrażenia w tablicy, możesz zwiększyć rozmiar pamięci podręcznej:

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

patrz http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.cachesize.aspx, aby uzyskać więcej informacji. Odpowiedź

+0

Powinien być 'Regex.Match (System.IO.File.GetFileName (ścieżka), wzorzec)' ponieważ 'GetFileNames' zwraca pełne ścieżki. –

2

Aleroot jest najlepszy, ale jeśli chcesz to zrobić w kodzie, można również zrobić to w ten sposób:

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

Jest to wysoce nieefektywne, ponieważ wywołanie Directory.GetFiles() będzie wykonywane raz dla każdego wzorca. Byłoby lepiej, gdyby odwrócić operacje: Directory.GetFiles (...). SelectMany (file => patterns) ... Ale oba te zwracają ten sam plik dwa razy, jeśli zdarzy się, że pasuje do dwóch wyrażeń . Zobacz moją odpowiedź na rozwiązanie, które tego nie robi, i jest jeszcze bardziej efektywne (przestanie dopasowywać, gdy tylko jeden wzorzec się dopasuje). –

+0

Rzeczywiście - i robienie tego za pomocą regex jest zdecydowanie najlepszym rozwiązaniem - jak już wspomniane :) – Nathan

Powiązane problemy