2013-01-22 44 views
18

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

मेरे पास सर्वर पर लिखने की प्रक्रिया पर कोई नियंत्रण नहीं है। इसके अलावा, मेरे पास लिखने के लिए हैंडल प्राप्त करने का प्रयास करने के लिए निर्देशिका पर लिखने की अनुमति नहीं है ताकि यह जांच सके कि क्या पहले से ही एक लिखने वाला हैंडल खुला है, तो यह विकल्प तालिका से बाहर है।

क्या इस समस्या को हल करने वाला कोई एफ़टीपी फ़ंक्शन है?

+4

सबसे अच्छा आप यह देख सकते हैं कि फ़ाइल को कुछ मिनट के लिए संशोधित नहीं किया गया है, एक मिनट कहें। –

+0

आप किस लाइब्रेरी को FTP क्लाइंट के लिए उपयोग कर रहे हैं? –

+0

यदि डाउनलोड शुरू करने के बाद लिखना शुरू होता है तो क्या होगा? –

उत्तर

21

यह एक बहुत पुरानी और प्रसिद्ध समस्या है।

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

यदि संभव हो, तो प्रोग्राम को संसाधित करने वाला प्रोग्राम आंशिक फ़ाइलों से निपटने में सक्षम होना चाहिए।

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

+0

वास्तव में मैं पहले से ही इस 5 मिनट की सीमा का उपयोग कर रहा हूं, बात यह है कि, मैं वास्तव में एक तेज फ़ाइल उपलब्धता का उपयोग कर सकता हूं। हालांकि मैं आपके समाधान को मेरे लिए काम करने के लिए एक मिनट से भी कम समय में फ़ाइल के आकार की जांच करने में सक्षम हो सकता हूं :) धन्यवाद जिम। –

+0

मुझे आश्चर्य है कि फ़ाइल पर खुले "लिखने-हैंडल" की संख्या के लिए ऑपरेटिंग सिस्टम से पूछताछ करने का कोई तरीका नहीं है? विशेष रूप से ftp के माध्यम से? –

+0

जो असफल स्थानांतरण और पूर्ण हस्तांतरण के बीच भेदभाव नहीं करेगा। यदि आप कर सकते हैं तो rsync प्रोटोकॉल का उपयोग करें, यह एक बेहतर काम करता है। –

0

आप अपाचे आम एपीआई get more information

boolean flag = retrieveFile(String remote, OutputStream local); 

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

+1

@ होसैन, उनका सवाल यह नहीं था कि किस लाइब्रेरी का उपयोग करना है, लेकिन यह सुनिश्चित करने के लिए कि वह सर्वर से अपूर्ण फाइलें डाउनलोड नहीं करता है, अपाचे एफ़टीपी लाइब्रेरी आपको यह नहीं बताती है कि यह हमेशा सर्वर से पूरी फ़ाइल डाउनलोड करेगा। –

+0

@ मोहम्मद वैसे भी मैं अपाचे सामान्य एफ़टीपी क्लाइंट पर एक नज़र डालेगा, धन्यवाद –

+0

@ मोहम्मद मैंने दस्तावेज की जांच की, ऐसा लगता है कि पुनर्प्राप्ति सफलतापूर्वक पूर्ण होने पर ध्वज सत्य है, इसका मतलब यह नहीं है कि यह एक फ़ाइल डाउनलोड नहीं करेगा अभी भी लिखा है। मेरा मतलब है कि यह फ़ाइल को जितना लिखा जाएगा उतना डाउनलोड करेगा। और यह सही हो जाएगा अगर यह अधूरा फ़ाइल सफलतापूर्वक डाउनलोड कर सकता है :) यही वह है जिसके बारे में मैं बात नहीं कर रहा हूं;) वैसे भी धन्यवाद –

7

यह एफ़टीपी से अधिक मौलिक है: आपको उन फ़ाइलों को पढ़ने में भी एक ही समस्या होगी, भले ही वे स्थानीय मशीन पर बनाए जा रहे हों।

यदि आप लेखन प्रक्रिया को संशोधित नहीं कर सकते हैं, तो आपको कुछ हुप्स से कूदना होगा। कोई भी महान नहीं है, लेकिन कुछ दूसरों की तुलना में सुरक्षित हैं।

  • कुछ विंडो के लिए कुछ भी नहीं होने तक पढ़ना जारी रखें (शायद एक मिनट, जैसे डेविड श्वार्टज़ सुझाव देता है)। आप फ़ाइल आकार देखकर इसे थोड़ा सा अनुकूलित कर सकते हैं।
  • अगर चित्र विश्वसनीय क्रम में क्रमशः लिखे गए हैं तो चित्रित करें। जब आप फ़ाइल एन दिखाई देते हैं, तो आप जानते हैं कि फ़ाइल एन -1 तैयार है। (मान लें कि फ़ाइलों को लिखे जाने से पहले निर्देशिका खाली है, हालांकि आप टाइमस्टैम्प भी देख सकते हैं।) नकारात्मकता यह है कि लेखक कभी भी ऑर्डर बदलता है या समानांतर में लिखना शुरू करता है तो आपका तर्क टूट जाएगा।

विश्वसनीय, सुरक्षित समाधान लेखक प्रक्रिया में सुधार की आवश्यकता है।

  • लेखक छिपा या अस्थायी स्थानों के लिए फ़ाइलों को लिख सकते हैं और केवल उन्हें दृश्यमान बनाएं एक बार पूरी फ़ाइल (या निर्देशिका), के लिए तैयार है सिमलिंक या फ़ाइल से आगे बढ़ या chmod का उपयोग कर।
  • लेखक अन्य फाइलें लिखे जाने के बाद ही एक विशेष फ़ाइल (उदा।, "./DONE") बनाता है, और पाठक तब तक कोई भी फाइल नहीं पढ़ता जब तक वह फ़ाइल मौजूद न हो।
  • फ़ाइल प्रकार के आधार पर, लेखक फ़ाइल के अंत में किसी प्रकार का अंत-फ़ाइल फ़ाइल/लाइन जोड़ सकता है, और पाठक यह सुनिश्चित कर सकता है कि यह मौजूद है।
+0

धन्यवाद dbort, मुझे आश्चर्य है कि ऑपरेटिंग सिस्टम को खुले "लिखने के लिए क्वेरी करने का कोई तरीका नहीं है फाइल पर "हैंडल"? विशेष रूप से ftp के माध्यम से? –

12

एक संभावित समाधान फ़ाइल को एक अलग फ़ाइल नाम (उदाहरण के लिए ".partial" जोड़कर) अपलोड कर देगा और फिर इसे अपने अंतिम नाम पर नामित करेगा।

यदि सर्वर को अंतिम नाम मिल जाता है तो अपलोड पूरा हो गया है।

यदि आप अपलोड प्रक्रिया को नियंत्रित नहीं कर सकते हैं तो आप जो पूछ रहे हैं वह परिभाषा के अनुसार असंभव है: फ़ाइल अपलोड नेटवर्क समस्या के कारण बंद हो सकता है या क्योंकि किसी भी कारण से प्रेषण प्रक्रिया रोक दी गई है।

प्राप्त करने वाला अंत क्या देखेगा केवल आने वाली धारा का समापन है; यह गारंटी देने का कोई तरीका नहीं है कि डेटा आंशिक हस्तांतरण नहीं होगा।

अन्य कामकाज एक अंत-डेटा-मार्कर के लिए जांच कर रहे हैं या भेजने के लिए सर्वर से अनुरोध कर सकते हैं कि यह जांचने के लिए कि क्या (उनके विचार में) स्थानांतरण पूरा हो गया है।

+0

दुख की बात है कि लेखक की प्रक्रिया मेरे नियंत्रण से बाहर है और मेरे साथ सहयोग नहीं करेगी, इसलिए मैं इसमें स्वयं हूं। –

+0

मुझे लगता है कि आप जो पूछ रहे हैं वह असंभव है। यदि प्रेषण सर्वर के बीच में प्रेषण सर्वर बंद हो जाता है और स्थानांतरण फिर से चालू नहीं होता है? प्राप्त करने वाली साइट से इसका पता लगाने का कोई तरीका नहीं है। – 6502

+0

ठीक है धन्यवाद –