2010-07-14 12 views
13

मैं एक उपकरण है जो एक नेटवर्क निर्देशिका निगरानी करता है और एक विंडोज सर्वर 2008 मशीन के बंद चल रहा है लिख रहा हूँ, FileSystemWatcher के लिए OnChanged घटना है कि किसी भी कंप्यूटर से नेटवर्क ड्राइव पर रखा फाइलों से सही ढंग से निकाल दिया जा रहा है का उपयोग नहीं कर विंडोज 7, किसी कारण से यदि प्रतिलिपि की गई फ़ाइलें की राशि एक विंडोज 7 कंप्यूटर (एक ही बार में) तो कोई घटनाओं निकाल दिया जाता है, हालांकि यह काम करता है, तो फ़ाइलों को व्यक्तिगत रूप से किया जाता है पर 19 से अधिक है। क्या इसके लिए कोई कामकाज है या यह है कि विंडोज 7 कर्नेल एफएसडब्लू कार्यक्रमों के साथ कैसे व्यवहार करता है?FileSystemWatcher और विंडोज 7

बस स्पष्ट करने के लिए यह फ़ाइलों के हजारों के लिए काम करता है जब एक XP मशीन से नकल। (सॉफ्टवेयर अभी भी 2008 सर्वर मशीन पर है)।

उत्तर

22

MSDN से:

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

यदि बफर आकार बढ़ाना पर्याप्त नहीं है और आप नियंत्रित नहीं कर सकते हैं कि एक बार में कितनी फ़ाइलें ट्रिगर कर रही हैं, आपको अतिरिक्त मतदान जोड़ना होगा।

भी इस संबंधित सवाल देखें:

FileSystemWatcher does not work properly when many files are added to the directory at the same time…

अद्यतन:

यह आकर्षक बस बफर आकार बढ़ाने लेकिन यह सावधानी से किया जाना चाहिए करने के लिए हो सकता है। वास्तव में, जब नेटवर्क पहुंच की बात आती है तो 64k सीमा होती है।

ReadDirectoryChangesW ERROR_INVALID_PARAMETER के साथ विफल बफर लंबाई से अधिक 64 KB है और आवेदन नेटवर्क पर एक निर्देशिका की निगरानी होती है जब: FileSystemWatcher वर्ग Windows API समारोह ReadDirectoryChangesW जिसके नीचे यह सीमा होती है उपयोग कर रहा है। यह अंतर्निहित फ़ाइल साझाकरण प्रोटोकॉल के साथ एक पैकेट आकार सीमा के कारण है।

आप बफर आकार को संशोधित करने की लागत पर एक गहरी समझ प्राप्त करना चाहते हैं तो आप Microsoft के वाल्टर वांग यहाँ के पद पर एक नजर है चाहिए:

FileSystemWatcher across the network (पूर्ण पोस्ट उद्धृत नीचे)

मुझे खेद है कि FileSystemWatcher.InternalBufferSize के प्रलेखन बफर आकार जब नेटवर्कनिगरानी के बारे में बहुत स्पष्ट राज्य नहीं था हूँपथ। नेटवर्क पथ की निगरानी करते समय यह सिफारिश की जाती है कि 64K से अधिक न हो।

FileSystemWatcher मूल रूप से एक है।Win32 ReadDirectoryChangesW API के लिए नेट रैपर। ReadDirectoryChangesW का उपयोग करने के लिए, आप बनाते हैं और एक बफर निर्दिष्ट करते हैं कि ओएस परिवर्तनों के साथ पॉप्युलेट करेगा। हालांकि, क्या ReadDirectoryChangesW प्रलेखन में उल्लेख नहीं है (लेकिन FileSystemWatcher डॉक्स में संकेत दिया है) कि फाइल सिस्टम जब तक यह अद्यतन करने के लिए मौका है परिवर्तन जानकारी अस्थायी रूप से स्टोर करने के लिए एक आंतरिक गिरी बफर बनाता है उपयोगकर्ता बफर का आकार जो कर्नेल बफर बनाया गया है ReadDirectoryChangesW में निर्दिष्ट एक ही आकार है और गैर-पेजेड पूल वाली मेमोरी में बनाया गया है। प्रत्येक बार एक फ़ाइल सिस्टम सिस्टम/ ReadDirectoryChangesW बनाया गया है/ कहा जाता है, एक नया कर्नेल बफर भी बनाया गया है।

कर्नेल स्मृति पूल (पृष्ठांकित और गैर-पृष्ठांकित) डिवाइस ड्राइवर और प्रयोग करने में अन्य कर्नेल घटकों के लिए प्रणाली पता स्थान में अलग सेट कर रहे हैं। वे आवश्यक रूप से गतिशील रूप से बढ़ते और घटते हैं। पूल का वर्तमान आकार पर कार्य प्रबंधक का प्रदर्शन टैब पर आसानी से देखा जा सकता है। पूल गतिशील रूप से बढ़ेगा जब तक कि वे अधिकतम मान को बूट करें, जिसे बूट समय पर गणना की जाती है और उपलब्ध सिस्टम संसाधनों (ज्यादातर रैम) पर निर्भर करता है। आप इस अधिकतम मान को हिट करना चाहते हैं या अन्य विभिन्न सिस्टम सेवाओं और ड्राइवर विफल होने लगेंगे। हालांकि, यह गणना की गई अधिकतम मान उपलब्ध नहीं है। अधिकतम पूल आकार निर्धारित करने के लिए, आपको कर्नेल डीबगर का उपयोग करने की आवश्यकता है। यदि आप सिस्टम मेमोरी पूल के बारे में अधिक जानकारी चाहते हैं, तो मैं अनुशंसा करता हूं कि आप एमएसपी्रेस पुस्तक में अध्याय 7 को देखें, सुलैमान द्वारा 0000 के अंदर और रसेलिनोविच।

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

वहाँ भूमि के ऊपर नेट अनुप्रयोगों के साथ जुड़ा हुआ है और मुझे लगता है कि एक Win32 ReadDirectoryChangesW कार्यक्रम एक ही बफर आकार के साथ बेहतर प्रदर्शन प्राप्त करने में सक्षम हो सकता है। हालांकि, बहुत तेजी से और कई फ़ाइल में परिवर्तन के साथ, बफर लगने अपरिहार्य हो जाएगा और डेवलपर एक उग आया तब होता है जब इस तरह के मैन्युअल रूप परिवर्तन का पता लगाने के लिए निर्देशिका की गणना मामले को संभाल करने के लिए जा रहा है।

अंत में, FileSystemWatcher और ReadDirectoryChangesW एक हल्के फ़ाइल परिवर्तन का पता लगाने तंत्र है कि इसके सीमाएं हैं करने के लिए जा रहा है। बदलें पत्रिकाओं एक और व्यवस्था है जिसके हम एक मध्यम वजन समाधान पर विचार करेगा है, लेकिन अभी भी सीमाएं हैं जाएगा:

http://msdn.microsoft.com/en-us/library/aa363798%28VS.85%29.aspx

भारी वजन समाधान एक समर्पित फ़ाइल सिस्टम फिल्टर चालक लिखने के लिए हो सकता है कि फ़ाइल सिस्टम में बैठता है और फ़ाइल सिस्टम परिवर्तनों की निगरानी करता है। बेशक यह सबसे जटिल दृष्टिकोण होगा। अधिकांश वायरस स्कैनर, बैकअप सॉफ्टवेयर, और फ़ाइल प्रणाली निगरानी उपयोगिताओं जैसे Filemon (www.sysinternals.com) एक फिल्टर चालक को लागू।

मुझे उम्मीद है कि स्पष्टीकरण से आपको समस्या समस्या का मूल कारण समझने में सहायता करता है। कृपया पर उत्तर दें हमें बताएं कि आपको और जानकारी चाहिए या नहीं। धन्यवाद।

+0

बस एक छोटा सा अतिरिक्त: डिफ़ॉल्ट बफर आकार 8192. –

4

फ़ाइलसिस्टम वाटर का उपयोग करने के कई प्रयासों के बाद मैंने इसे छोड़ दिया है। यह गलत समय पर, गलत प्रकार पर घटनाओं को सही ढंग से नहीं फेंक देगा। ईमानदारी से मुझे लगता है कि यह नेट फ्रेमवर्क में सबसे खराब कक्षाओं में से एक है। मैंने हमेशा अपनी खुद की कक्षा लिखना समाप्त कर दिया है जो एक सिस्टम लेता है। टिमर और एक्स मिलीसेकंड के बाद यह निर्देशिकाओं को मैन्युअल रूप से जांचता है। हां यह अधिक काम लेता है और हाँ यह मामूली पिटा हो सकता है लेकिन एक बार जब आप इसे लिख लेंगे तो आप इसे कहीं भी इस्तेमाल कर सकते हैं। मेरी इच्छा है कि FileSystemWatcher विज्ञापन के रूप में काम करता है लेकिन मुझे ऐसा करने के लिए कभी नहीं मिला है।

+0

मैं मानता हूँ कि 'FileSystemWatcher' स्पष्ट रूप से सभी परिस्थितियों में उचित नहीं है। हालांकि, एक क्षमता जो यह प्रदान करती है जो एक सरल निर्देशिका गणना के साथ करना मुश्किल है फ़ाइल नामों का पता लगाना है। यह किया जा सकता है (फ़ाइल संपत्ति तुलना, हेरिस्टिक्स, एमडी 5 रकम, आदि का उपयोग कर), लेकिन यह एक परेशानी है। – stakx

+0

@stakx, यह बहुत सच है, मैंने फ़ाइल नाम परिवर्तनों की जांच करने की कभी कोशिश नहीं की है। मैं बस उस वर्ग द्वारा इतना जला दिया गया है कि मैं इसका कभी भी उपयोग नहीं करता हूं। – Justin

2

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

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

+0

जो ओपी के बारे में बात कर रहे असंगतता से एक पूरी तरह से अलग मुद्दा की तरह लगता है। – Chad

+0

@ चाड: यह पूरी तरह से असंबंधित कैसा लगता है? मैं कहूंगा कि यह ओपी की समस्या के आसपास काम करने के लिए एक विधि की तरह लगता है। –

+0

क्योंकि ओपी कहता है कि घटना बिल्कुल भी आग नहीं है। लॉरेन बताते हैं कि * जब घटना आग लगती है * वे मैन्युअल रूप से निर्देशिका की जांच करते हैं, लेकिन अगर घटना पहले स्थान पर कभी नहीं आग लगती है तो ओपी ऐसा नहीं कर सकता है। इस प्रकार, लॉरेन टिप्पणी ओपी देख रहे एक ही समस्या के बारे में नहीं है। कम से कम, लॉरेन की टिप्पणी के संबंध में ओपी के सवाल को मैंने कैसे पढ़ा। – Chad

0

यह एक वास्तव में अविश्वसनीय वर्ग है, जब फाइलें एक निश्चित दहलीज से ऊपर होती हैं, तो मैंने शुरुआती प्रतिलिपि पर 7 बार फायरिंग की घटनाएं की हैं और फिर जब फ़ाइल स्थानांतरण संवाद किया जाता है तो मुझे एक और 7 घटनाएं मिलती हैं, यह समस्या पूरी तरह से दिखाई देती है सभी ओएस जो एफएसडब्ल्यू का समर्थन करते हैं। यद्यपि विंडोज 7 (अभी तक विस्टा की कोशिश नहीं की है) अभी भी एक समय में केवल एक या 1 9 फाइलों को स्वीकार करता है, जबकि अगर मैं एक एक्सपी मशीन से नेटवर्क ड्राइव में फ़ाइलों को छोड़ देता हूं तो मैं बिना किसी समस्या के हजारों फाइलें पढ़ सकता हूं। यह सिर्फ XP से 7 तक ReadDirectoryChangesW में परिवर्तन हो सकता है। पिछली 1 9 फाइलें मुझे किसी भी घटना को आग नहीं मिल सका, इसलिए मुझे लगता है कि अब मेरे टूल का "फीचर" बन जाएगा। अगर किसी के पास कोई अन्य जानकारी है तो योगदान करने में संकोच न करें।

-1

आप MacOSX + समानताएं डेस्कटॉप + Windows का उपयोग करते हैं, तो आपका कोड काम नहीं करता, अपने FileSystemWatcher.Path संपत्ति की वजह से करने के लिए मैक पथ लक्ष्य है, यह एक यूएनसी पथ है, यह समर्थित नहीं है!

enter image description here