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

      } 

मेरा उपरोक्त कार्यक्रम एक पैटर्न के साथ अच्छी तरह से काम करता है।निर्देशिका सी # में मिलान पैटर्न के साथ फाइलें खोजें?

मैं एक मिलान पैटर्न के साथ निर्देशिका में फ़ाइलों को खोजने के लिए उपर्युक्त प्रोग्राम का उपयोग कर रहा हूं लेकिन मेरे मामले में मेरे पास कई पैटर्न हैं इसलिए मुझे string pattern वैरिएबल में एकाधिक पैटर्न पास करने की आवश्यकता है लेकिन मेरे पास कोई नहीं है विचार करें कि मैं Regex.Match में उन पैटर्न का उपयोग कैसे कर सकता हूं।

क्या कोई मेरी मदद कर सकता है?

उत्तर

9

आप रख सकते हैं एक याregex में:

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

सही दोस्त, thankss! –

1

सरलतम रूप आप उदाहरण

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

इस अपने चुना पैटर्न या whith फ़ाइलों से मेल खाएगी लिए क्या कर सकते में एबीसी पैटर्न या एक्सटेंशन के साथ फाइलें .doc

पैटर्न ए के लिए एक संदर्भ Regex वर्ग के लिए ailable हो सकता है found here

4

परिवर्तन

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

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

के लिए जहां पैटर्न एक IEnumerable<string> है, उदाहरण के लिए:

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

आप और अधिक तो 15 है, तो सरणी में अभिव्यक्ति, आप कैश आकार में वृद्धि करना चाह सकते हैं:

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

अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.cachesize.aspx देखें।

+0

'Regex.Match (System.IO.File.GetFileName (पथ), पैटर्न होना चाहिए 'क्योंकि' GetFileNames 'पूर्ण पथ लौटाता है। –

2

Aleroot के जवाब सबसे अच्छा है, लेकिन अगर आप इसे अपने कोड में करना चाहता था, आप भी इसे इस तरह कर सकता है:

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

यह अत्यधिक अक्षम है, क्योंकि निर्देशिका के बाद Directory.GetFiles() कॉल निष्पादित की जाएगी। यदि आप ऑपरेशन को उलट देते हैं तो यह बेहतर होगा: Directory.GetFiles (...)। SelectMany (file => pattern) ... लेकिन दोनों अभिव्यक्तियों से मेल खाने के लिए दोनों ही फाइलें दो बार वापस आ जाएंगी । समाधान के लिए मेरा उत्तर देखें जो ऐसा नहीं करता है, और परिणामस्वरूप यह और भी अधिक कुशल है (यह एक पैटर्न मैचों के साथ मेल खाने से रोक देगा) –

+0

दरअसल - और रेगेक्स के साथ इसे करने से अब तक का सबसे अच्छा समाधान है - पहले ही उल्लेख किया :) – Nathan

संबंधित मुद्दे