2008-09-11 9 views
17

इंटरनेट पर कई पोस्ट हैं जहां ReadDirectoryChangesW API फ़ंक्शन अनुपलब्ध फ़ाइलें हैं जब बहुत सारी फ़ाइल गतिविधि होती है। अधिकांश गति उस पर दोष देते हैं जिस पर ReadDirectoryChangesW फ़ंक्शन लूप कहा जाता है। यह एक गलत धारणा है। सबसे अच्छा विवरण मैंने देखा है, निम्नलिखित पोस्ट में सोमवार, 14 अप्रैल को टिप्पणी, 2008 14:15:27गायब फ़ाइल परिवर्तनों से ReadDirectoryChangesW को कैसे रखें

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/

सारांश यह है कि ReadDirectoryChangesW समारोह रिपोर्ट परिवर्तन फ़ाइल के रूप में वे छोड़ दें फाइल-राइट-पीछे कतार, जैसा कि वे जोड़े गए हैं। और यदि प्रतिबद्ध होने से पहले बहुत से जोड़े गए हैं, तो आप उनमें से कुछ पर नोटिस खो देते हैं। यदि आप निर्देशिका में 1000+ फ़ाइलों को वास्तविक त्वरित उत्पन्न करने के लिए केवल एक प्रोग्राम लिखते हैं, तो आप इसे अपने कार्यान्वयन के साथ देख सकते हैं। बस गिनें कि आपको कितनी फाइल इवेंट नोटिस मिलती है और आप देखेंगे कि ऐसे समय होते हैं जब आप उन सभी को प्राप्त नहीं करेंगे।

सवाल यह है कि, क्या किसी को भी हर बार वॉल्यूम फ्लश किए बिना ReadDirectoryChangesW फ़ंक्शन का उपयोग करने के लिए एक विश्वसनीय विधि मिली है? यदि उपयोगकर्ता प्रशासक नहीं है और इसे पूरा करने में कुछ समय लग सकता है तो इसकी अनुमति नहीं है।

उत्तर

1

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

तो अगर आप पिछले 50-100 बार ReadDirectoryChangesW /FSW घटना हुआ का ट्रैक रखने के लिए, और आप देखते हैं कि यह तेजी से बुलाया जा रहा है, तो आप इस का पता लगाने और विशेष हालत को गति प्रदान सभी फाइलों को प्राप्त करने के लिए कर सकते हैं जो कुछ सेकंड में बदल दिए गए हैं (और भविष्य में फर्जी एफएसडब्ल्यू घटनाओं को अस्थायी रूप से रोकने के लिए ध्वज सेट करें)।

चूंकि कुछ लोग इस समाधान के बारे में टिप्पणियों में उलझन में हैं, इसलिए मैं यह अनुमान लगा रहा हूं कि आपको Read रखना चाहिए कि ReadDirectoryChangesW से कितनी तेजी से घटनाएं आ रही हैं और जब वे बहुत तेज़ी से पहुंच रहे हैं, तो वर्कअराउंड (आमतौर पर मैन्युअल स्वीप एक निर्देशिका)।

+1

यह लगभग 99% समय के लिए काम करेगा। क्या होता है यदि किसी अन्य निर्देशिका में एक फ़ाइल (अन्यथा जिसमें बहुत से फ़ाइल में परिवर्तन होता है) वह छोड़ दिया जाता है। आप परिवर्तनों के लिए एक निर्देशिका को स्कैन करेंगे लेकिन किसी अन्य फ़ाइल में बदलाव को याद करेंगे। –

+0

FileSystemWatcher क्लास ReadDirectoryChangesW को लपेटने के लिए एक .NET तरीका है, इसलिए नहीं, इससे मदद नहीं मिलती है। – Garen

+0

मेरा उत्तर ReadDirectoryChangesW के वर्कअराउंड को ट्रिगर करने के लिए समय अवधि के भीतर # घटनाओं का पता लगाने के बारे में अधिक था। – hova

0

मुझे एक ही समस्या से मुलाकात हुई। लेकिन, मुझे कोई समाधान नहीं मिला जो सभी घटनाओं को प्राप्त करने की गारंटी देता है। कई परीक्षणों में, मुझे पता चलेगा कि GetDueuedCompletionStatus फ़ंक्शन लौटने के बाद ReadDirectoryChangesW फ़ंक्शन को जितनी जल्दी संभव हो सके कहा जाना चाहिए। मुझे लगता है कि फाइल सिस्टम की प्रसंस्करण गति मेरे आवेदन प्रसंस्करण की गति से बहुत तेज है, तो एप्लिकेशन कुछ घटनाओं को खोने में सक्षम हो सकता है।

वैसे भी, मैंने एक निगरानी तर्क से एक पार्सिंग तर्क को अलग किया और थ्रेड पर एक पार्सिंग तर्क रखा।

+0

मैंने कुछ इसी तरह का उपयोग करके समस्या को सफलतापूर्वक हल किया। घटनाओं को कतार दें या उन्हें बाद में प्रसंस्करण के लिए फ़ाइल में लिखें। उन्हें डिस्क पर लिखना मेरे लिए महत्वपूर्ण था। यह धीमा प्रतीत हो सकता है लेकिन डिस्क्स कैश किए गए हैं और ओवरहेड डीबी से कम है। मेरा प्रोग्राम फ़ाइल परिवर्तन के प्रति दिन लगभग 1 टीबी प्रतिबिंबित करता है- प्रति दिन सैकड़ों फाइलें। – SilentSteel

1

हमने कभी भी ReadDirectoryChangesW को 100% विश्वसनीय नहीं देखा है। लेकिन, इसे संभालने का सबसे अच्छा तरीका "हैंडलिंग" से "रिपोर्टिंग" अलग है।

मेरे कार्यान्वयन में एक थ्रेड है जिसमें सभी घटनाओं को फिर से कतार करने के लिए केवल एक ही काम है। फिर मेरी मध्यवर्ती कतार को संसाधित करने के लिए एक दूसरा धागा। आप मूल रूप से, जितना संभव हो सके घटनाओं की रिपोर्टिंग को बाधित करना चाहते हैं।

उच्च CPU स्थितियों के तहत, आप वॉचर ईवेंट की रिपोर्टिंग में बाधा डाल सकते हैं।

+0

चूंकि मेरे पास ऊपर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं कहूंगा कि शीर्ष समाधान बहुत अच्छा है। 99% मामलों के लिए यह आपको "लगभग वहां" मिलता है। इसमें 1 और चीज जोड़ें, जो परिवर्तनों को देखने के लिए आप देख रहे फ़ोल्डरों का आवधिक कुल रेस्कैन जोड़ें। – Lompican

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