2012-02-07 6 views
7

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

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

+0

मैं बस कुछ ही मिनटों पहले इस सवाल का पाया: http://stackoverflow.com/questions/559659/how-to-know-a-file-is-finished-copying यह बहुत मेरी समस्या के समान है, लेकिन "अनुमोदित "समाधान सुरुचिपूर्ण और कार्यात्मक होने से बहुत दूर है। – petersaints

+0

अपने कोड यानी, किसी प्रणाली सेवा के रूप में एक प्रशासनिक संदर्भ में चल रहा है, हो जाएगा, तो आप एक परिवर्तन पत्रिका इस्तेमाल कर सकते हैं। Http://msdn.microsoft.com/en-us/library/windows/desktop/aa363798%28v=vs.85%29.aspx –

+0

देखें 'फ़्रेड() '/' fwrite का उपयोग करके बेवकूफ प्रतिलिपि जैसी चीजों की संभावना को ध्यान में रखते हुए() 'मुझे नहीं लगता कि एक सामान्य समाधान है। काफी मजबूत नहीं है, लेकिन शायद फाइलों के लिए खुले हैंडल को ट्रैक करके? –

उत्तर

4

आप या तो लॉक फाइल या एक विशेष नामकरण सम्मेलन का उपयोग कर सकते हैं। सबसे आसान यह बाद वाला है और इस तरह कुछ काम करेगा:

कहें कि आप "fileA.txt" नाम की एक फ़ाइल को स्थानांतरित करना चाहते हैं, इसे गंतव्य निर्देशिका में कॉपी करते समय, इसे "fileA.txt.partial" पर कॉपी करें या ऐसा कुछ। जब प्रतिलिपि पूरी हो जाती है, तो फ़ाइल को "fileA.txt.partial" से "fileA.txt" में बदलें। तो "fileA.txt" की उपस्थिति परमाणु है जहां तक ​​देखने वाला प्रोग्राम देख सकता है।

जैसा कि पहले उल्लेख किया गया दूसरा विकल्प लॉक फाइल है। तो जब आप "fileA.txt" नाम की एक फ़ाइल की प्रतिलिपि बनाते हैं, तो आप पहले "fileA.txt.lock" नामक फ़ाइल बनाते हैं। जब प्रतिलिपि पूरी की जाती है, तो आप बस लॉक फ़ाइल को हटा देते हैं। जब देखने वाले प्रोग्राम को "fileA.txt" दिखाई देता है, तो यह जांचना चाहिए कि "fileA.txt.lock" मौजूद है या नहीं, अगर यह आवश्यक है, तो वह भविष्य में उस फ़ाइल को प्रतीक्षा या पुनरीक्षित कर सकता है।

+2

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

+0

सुनिश्चित नहीं है कि यदि आपके पास फ़ाइलों की प्रतिलिपि बनाई गई है, तो इस पर कोई नियंत्रण नहीं है। क्योंकि मतदान एक अच्छा विचार है कि मैं कुछ बेहतर से बदलने के लिए कोशिश कर रहा हूँ नहीं है –

2

आपको मतदान नहीं करना चाहिए। परिवर्तनों के लिए निर्देशिका देखने के लिए FindFirstChangeNotification (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417%28v=vs.85%29.aspx) का उपयोग करें।

फिर परिवर्तन सूचनाओं पर प्रतीक्षा करने के लिए प्रतीक्षा कार्य (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx) का उपयोग करें।

अवलोकन और उदाहरण यहाँ: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx

मुझे यकीन है कि कैसे वास्तव में फाइल लिखने पूरा होने के निर्धारित किया जा सकता नहीं हूँ। इवान टेरन का जवाब एक अच्छा विचार है।

+0

यह बिल्कुल नहीं है;) और हां! मैंने उन तरीकों को पाया और मेरे पास पहले से ही एक समाधान है: http://code.google.com/p/simplefilewatcher/। फ़ाइल लेखन पूर्णता निर्धारित करने के लिए समस्या है। वह लाइब्रेरी (जिसे मैंने पहले ही संशोधित किया है) ReadDirectoryChangesW का उपयोग करता है जो मुझे विश्वास है कि यह FindFirstChangeNotification से भी अधिक शक्तिशाली है। – petersaints

+0

एक तरफ ध्यान दें, मुझे आश्चर्य है कि ड्रॉपबॉक्स (उदाहरण के लिए) इस तरह के मुद्दों से कैसे निपटता है। – petersaints

+0

आप अनन्य लेखन के लिए फ़ाइल खोलने का प्रयास कर सकते हैं, जो कॉपी समाप्त होने तक विफल हो जाएगा। संभवतः उस स्थिति को अवरुद्ध करने के बजाय, उस स्थिति को अवरुद्ध करने का एक तरीका है, लेकिन मुझे इसे दूर नहीं पता है। –

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