2011-08-06 9 views
48

हर जगह मैं कोड के इन दो पंक्तियों प्रदान की नमूनों में फाइल सिस्टम द्रष्टा के लिए फिल्टर स्थापित करने के लिए प्रयोग किया जाता है लगता है ..एकाधिक फ़ाइल प्रकारों के लिए FileSystemWatcher के लिए फ़िल्टर कैसे सेट करें?

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Filter = "*.txt"; 
//or 
watcher.Filter = "*.*"; 

लेकिन मैं अपने द्रष्टा अधिक फ़ाइल प्रकारों की निगरानी करना चाहते, लेकिन सभी नहीं। मैं इस लक्ष्य को हासिल कर सकते हैं कैसे:

//watcher.Filter = "*.txt" | "*.doc" | "*.docx" | "*.xls" | "*.xlsx"; 

मैं इन की कोशिश की:

watcher.Filter = "*.txt|*.doc|*.docx|*.xls|*.xlsx"; 
// and 
watcher.Filter = "*.txt;*.doc;*.docx;*.xls;*.xlsx*"; 

दोनों काम नहीं किया। यह सिर्फ मूल बातें है लेकिन मुझे याद आती है। धन्यवाद ..

उत्तर

35

एक कामकाज है। विस्तार कर रहे हैं की स्ट्रिंग के लिए की तुलना द्वारा

FileSystemWatcher objWatcher = new FileSystemWatcher(); 
objWatcher.Filter = "*.*"; 
objWatcher.Changed += new FileSystemEventHandler(OnChanged); 

private static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    // get the file's extension 
    string strFileExt = getFileExt(e.FullPath); 

    // filter file types 
    if (Regex.IsMatch(strFileExt, @"\.txt)|\.doc", RegexOptions.IgnoreCase)) 
    { 
     Console.WriteLine("watched file type changed."); 
    } 
} 
+1

अच्छा कामकाज। क्या आपको पता है कि यह प्रदर्शन को प्रभावित करेगा? –

+2

@ एंडर्स हाबेल: आपका अनुमान मेरे जितना अच्छा है!यदि देखे गए फ़ोल्डर में बहुत से फ़ाइल परिवर्तन होते हैं, और यदि उनमें से अधिकतर परिवर्तन _unwatched_ फ़ाइल प्रकारों के लिए हैं, तो आप एक जुर्माना लगा रहे हैं। अन्यथा, यह एक ओवरहेड का अधिक नहीं होना चाहिए। अंत में, आप कुछ और नहीं कर सकते हैं, है ना? (जब तक Win32 एपीआई नहीं जा रहा) – Mrchief

+0

हाहा। मिर्च, एक अच्छा कामकाज। मुझे यकीन नहीं है कि मैं उसके लिए जाऊंगा। @ एंडर्स हाबेल ने एक और कामकाज दिया है। अब मैं उलझन में हूं कि उत्तर के रूप में चिह्नित करने के लिए .. :) – nawfal

72

आप ऐसा नहीं कर सकते। Filter संपत्ति एक समय में केवल एक फ़िल्टर का समर्थन करती है। documentation से:

*.txt|*.doc जैसे कई फ़िल्टरों का उपयोग समर्थित नहीं है।

आपको प्रत्येक फ़ाइल प्रकार के लिए FileSystemWatcher बनाने की आवश्यकता है। फिर आप उन्हें ईवेंट हैंडलर के उसी सेट पर बाध्य कर सकते हैं:

string[] filters = { "*.txt", "*.doc", "*.docx", "*.xls", "*.xlsx" }; 
List<FileSystemWatcher> watchers = new List<FileSystemWatcher>; 

foreach(string f in filters) 
{ 
    FileSystemWatcher w = new FileSystemWatcher(); 
    w.Filter = f; 
    w.Changed = MyChangedHandler; 
    watchers.Add(w); 
} 
+0

ठीक है, इसके लिए धन्यवाद। माइक्रोसॉफ्ट के चेहरे पर यह कहने के बाद मुझे अन्य उत्तरों की भी प्रतीक्षा नहीं करनी चाहिए कि यह संभव नहीं है! : x :) – nawfal

+0

pbls624 के उत्तर के अनुसार यह '*। *' के लिए पंजीकरण करने से कम अक्षम है और मैन्युअल रूप से फ़िल्टरिंग करता है। –

2

तुम भी फ़िल्टर कर सकते FileInfo का उपयोग करके:

विचार, सभी विस्तार के लिए और उसके बाद OnChange घटना में घड़ी वांछित विस्तार के लिए को फ़िल्टर करना है खोज रहे हैं

उदाहरण के लिए एक फ़ाइल बदल घटना के लिए हैंडलर दिखाई देगा:

void File_Changed(object sender, FileSystemEventArgs e) 
    { 
     FileInfo f = new FileInfo(e.FullPath); 

     if (f.Extension.Equals(".jpg") || f.Extension.Equals(".png")) 
     { 
      //Logic to do whatever it is you're trying to do goes here    
     } 
} 
+0

यही वह है जो श्रीचिफ़ का जवाब अनिवार्य रूप से है। – nawfal

16

Mrchief की और jdhurst के समाधान के विस्तार करने के लिए:

private string[] extensions = { ".css", ".less", ".cshtml", ".js" }; 
private void WatcherOnChanged(object sender, FileSystemEventArgs fileSystemEventArgs) 
{ 
    var ext = (Path.GetExtension(fileSystemEventArgs.FullPath) ?? string.Empty).ToLower(); 

    if (extensions.Any(ext.Equals)) 
    { 
     // Do your magic here 
    } 
} 

इस regex चेकर समाप्त (मेरे मन में है जो बहुत अधिक उपरि), और लिंक को हमारे लाभ के लिए उपयोग करता है। :)

संपादित - संभावित NullReferenceException से बचने के लिए नल चेक जोड़ा गया।

+1

क्यों न केवल "एक्सटेंशन। (Ext) का उपयोग करें? सरल। या इससे भी बेहतर, "एक्सटेंशन। शामिल हैं (ext, StringComparer.InvariantCultureIgnoreCase)" – nawfal

9

परावर्तक में एक त्वरित रूप से पता चलता है कि विंडोज़ एपीआई फाइल सिस्टम परिवर्तन की सूचना देने के बाद फ़िल्टर कोडिंग नेट कोड में किया जाता है।

इसलिए मैं सुझाव दूंगा कि एकाधिक वॉचर्स को पंजीकृत करने का दृष्टिकोण अक्षम है क्योंकि आप एपीआई पर अधिक लोड डाल रहे हैं जिससे कई कॉलबैक होते हैं और केवल एक फ़िल्टर मेल खाता है। केवल एक वॉचर को पंजीकृत करने और परिणामों को स्वयं फ़िल्टर करने के लिए बहुत बेहतर है।

+0

@vape व्यक्तिगत रूप से मुझे लगता है कि यह उत्तर प्रश्न के लिए बहुत मूल्यवान जानकारी जोड़ता है। मैं स्रोत कोड देखने के अपने खोज के लिए प्रमाणित कर सकते हैं। – nawfal

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