2011-09-09 31 views
5

मैं FileSystemWatcher उपयोग कर रहा हूँ एक फ़ोल्डर जहाँ फ़ाइलों वेब अनुप्रयोग से अपलोड किया जा रहा है स्कैन करने के लिए। मेरे पास फ़ोल्डर में 1000 से अधिक फाइलें अपलोड की जा रही हैं। अब, समस्या यह है कि फ़ाइल सिस्टम सिस्टम प्रारंभ होता है जब पहली फ़ाइल की प्रतिलिपि बनाई जाती है, कभी-कभी, यह सभी फ़ाइलों के लिए काम नहीं करती है। कोई भी सुझाव अत्यधिक सराहनीय होगा।FileSystemWatcher काम नहीं कर ठीक से

उत्तर

8

FileSystemWatcherdocumentation का कहना है कि (जोर मेरा):

विंडोज ऑपरेटिंग सिस्टम फ़ाइल के अपने घटक FileSystemWatcher द्वारा बनाई गई एक बफर में आने वाले बदलाव सूचित करता है। कम समय में कई परिवर्तन होते हैं, तो बफर अतिप्रवाह कर सकते हैं। यह घटक निर्देशिका में परिवर्तनों का ट्रैक खोने के लिए कारण बनता है, और यह केवल कंबल अधिसूचना प्रदान करेगा। के साथ बफर के आकार को बढ़ाने के लिए InternalBufferSize प्रॉपर्टी महंगी है, क्योंकि यह गैर-पजेड मेमोरी से आता है जिसे डिस्क पर नहीं बदला जा सकता है, इसलिए बफर को तब तक छोटा रखें जितना कि कोई भी फ़ाइल परिवर्तन ईवेंट याद न करें। एक बफर अतिप्रवाह से बचने के लिए NotifyFilter और IncludeSubdirectories गुणों का उपयोग करें ताकि आप बाहर अवांछित परिवर्तन सूचनाएं फ़िल्टर कर सकते हैं।

नोट जब बफर आकार पार हो गई है एक FileSystemWatcher एक घटना छूट सकती हैं। लापता घटनाओं से बचने के लिए इन दिशानिर्देशों का पालन करें:

InternalBufferSize संपत्ति की स्थापना द्वारा बफर आकार बढ़ाएँ।

लंबे फ़ाइल नामों वाली फ़ाइलों को देखने से बचें, क्योंकि लंबी फ़ाइल नाम बफर भरने में योगदान देता है। छोटे नामों का उपयोग करके इन फ़ाइलों का नाम बदलने पर विचार करें।

यथासंभव कम अपने ईवेंट प्रबंधन कोड रखें।

आप ऊपर की कोशिश की है और यह अभी भी आप के लिए पर्याप्त विश्वसनीय नहीं है, तो मैं डर एकमात्र समाधान Error घटना की सदस्यता और मैन्युअल निर्देशिका सामग्री की गणना जब भी यह होता है करने के लिए किया जाएगा हूँ।

3

जॉन की जवाब पर विस्तार से बता दें:

वहाँ घटित से एक बफर अतिप्रवाह स्थगित करने के लिए एक और संभव समाधान है। आपके द्वारा मॉनीटर की जाने वाली घटनाओं को संभालने के द्वारा, उदाहरण के लिए बनाई गई घटना, जितनी जल्दी हो सके आप बफर से ईवेंट से जुड़ी जानकारी को हटा दें ताकि वह इस स्पेस को पुनः प्राप्त कर सके।

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

उदाहरण के लिए:

public class FileProcessor 
{ 
    private readonly Queue<string> files = new Queue<string>(); 

    public void EnqueueFile(string path) 
    { 
     files.Enqueue(path); 
    } 
} 

घटना को बनाया घटना से जुड़ी हैंडलर के लिए कोड तो यह करने के लिए कम किया जा सकता:

static void file_Created(object sender, FileSystemEventArgs e) 
{ 
    _fileProcessor.EnqueueFile(e.FullPath); 
} 

आप इस (सहित नमूना कोड के बारे में अधिक जानकारी पा सकते हैं) एक पोस्ट में मैं लगभग दो साल पहले लिखा था:

http://cgeers.com/2009/08/14/monitoring-a-directory/

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