2011-02-11 2 views
6

ठीक है तो शुरू करने के लिए इस Windows के लिए ही है और मैं उपयोग करने के लिए पसंद करते हैं सी ++ से अधिक नेट लेकिन मैं boost::filesystem करने का विरोध नहीं कर रहा हूँ, हालांकि मुझे लगता है कि चाहते हैं तो यह सीधे Windows API के पक्ष में बचा जा सकता है।यह निर्धारित करने के लिए कि आगे की प्रक्रिया के लिए फाइलें कब की जाती हैं?

अब परिदृश्य एक और मशीन मैं नहीं बदल सकते पर एक आवेदन मशीन है कि मैं का बैकअप बनाने और कुछ अतिरिक्त संसाधन क्या करने की जरूरत पर एक विशेष निर्देशिका में फ़ाइलों को बनाने के लिए जा रहा है है। वर्तमान में मैंने एक छोटा सा एप्लीकेशन बनाया है जो FindFirstChangeNotification और FindNextChangeNotification विंडोज एपीआई का उपयोग कर लक्षित निर्देशिका में परिवर्तन अधिसूचनाओं के लिए बैठेगा और सुनेंगे।

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

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

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

कोई सुझाव?

+0

बैकअप प्रोग्राम के बारे में क्या? –

उत्तर

4

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

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

+0

मैंने फ़ाइल विकास के साथ समय-समय पर विचार के साथ खिलवाड़ किया लेकिन यह लॉक अनुरोधों से भी बदतर लग रहा था। शायद मैं आशावादी हूं कि एक समाधान है जिसमें मतदान शामिल नहीं है। – AJG85

+1

समस्या यह है कि स्थानीय ओएस एक सफल अंत-फ़ाइल के बीच अंतर को एक त्याग या बाधित प्रतिलिपि बनाम नहीं बता सकता है, इसलिए यह भी कोशिश नहीं करता है।यहां तक ​​कि ताले की विधि के लिए मतदान भी मूर्खतापूर्ण नहीं है क्योंकि एक बाधित प्रतिलिपि के परिणामस्वरूप खोया ताला हो जाएगा और जब फ़ाइल को फिर से शुरू किया जा सकता है तो इसका पहले से ही समर्थन किया जा सकता है। चूंकि डब्लूएमक्यू FTE उन उत्पादों में से एक है जिनकी मैं विशेषज्ञता करता हूं, मैं इसे बहुत और कई प्लेटफ़ॉर्म पर देखता हूं। एक गैर-मामूली समस्या होने के लिए बाहर निकलता है। –

+0

यह भी एक उत्कृष्ट बिंदु है कि मैंने उस संभावना को भी नहीं सोचा था। नो-बाइट सिग्नल फ़ाइल रणनीति के लिए – AJG85

2

ऐसा लगता है कि ReadDirectoryChangesW आपकी सबसे अच्छी शर्त होगी। प्रत्येक फ़ाइल प्रतिलिपि ऑपरेशन के लिए, आपको FILE_ACTION_ADDED प्राप्त करना चाहिए जिसके बाद FILE_ACTION_MODIFIED अधिसूचनाओं का एक समूह होगा। अंतिम FILE_ACTION_MODIFIED अधिसूचना पर, फ़ाइल को प्रतिलिपि प्रक्रिया द्वारा लॉक नहीं किया जाना चाहिए। इसलिए, यदि आप कॉपी के प्रत्येक FILE_ACTION_MODIFIED के बाद लॉक प्राप्त करने का प्रयास करते हैं, तो कॉपी पूर्ण होने तक इसे विफल होना चाहिए। यह एक विशेष रूप से सुरुचिपूर्ण समाधान नहीं है, लेकिन फ़ाइल प्रतिलिपि पूर्ण होने पर कोई अधिसूचना उपलब्ध नहीं होती है।

+0

समस्या मेरे परीक्षण में कम से कम विंडोज 7 में फ़ाइल सिस्टम की कैशिंग तंत्र प्रतीत होती है। मुझे केवल 'FILE_NOTIFY_CHANGE_CREATION' के ठीक बाद एक' FILE_NOTIFY_CHANGE_LAST_WRITE' मिलता है। यह पूर्ण आकार में गंतव्य फ़ाइल भी प्रतीत होता है, भले ही प्रतिलिपि पूरी नहीं हो पाती है, इसलिए केवल एक ही FILE_NOTIFY_CHANGE_SIZE' फ़ायरिंग भी है। नोटिफिकेशन खोने से बचने के लिए मुझे 'ReadDirectoryChangesW' को कॉल करने के लिए एक वर्कर थ्रेड बनाने की आवश्यकता हो सकती है, लेकिन इस ऑपरेशन में कितना समय लगता है कि मैं वर्तमान कार्यान्वयन के साथ भी एक से अधिक प्राप्त करने की उम्मीद करता हूं। – AJG85

+0

@ AJG85 आपका अवलोकन सही है, पहले फ़ाइल आकार प्रतिलिपि के दौरान सेट किया गया है (कम से कम एक्सप्लोरर द्वारा) तो डेटा लिखा जाता है। –

0

फ़ाइल बंद होने के बाद आप डेटा को संसाधित कर सकते हैं, है ना? इसलिए फ़ाइल बंद होने पर ट्रैक करना है। यह फ़ाइल सिस्टम फ़िल्टर ड्राइवर का उपयोग करके किया जा सकता है। आप अपना खुद का लिख ​​सकते हैं या आप हमारे CallbackFilter उत्पाद का उपयोग कर सकते हैं।

+0

क्या आपके पास फ़ाइल सिस्टम फ़िल्टर ड्राइवर के बारे में अधिक जानकारी के साथ एक संदर्भ लिंक है, इसलिए मैं यह निर्धारित कर सकता हूं कि यह कुछ लागू करने योग्य है या नहीं? यह इस परियोजना के समय की बाधाओं के प्रयासों के दायरे से परे इस तरह इंटरसेप्टिंग सिस्टम आंतरिक और इस तरह लगता है। – AJG85

+0

AJG85 वास्तव में यदि आप अपना खुद का फ़िल्टर लागू करना चाहते हैं, तो इसमें महीनों का काम लगेगा। फ़िल्टर पर जानकारी यहां दी गई है: http://www.microsoft.com/whdc/driver/filterdrv/default.mspx –