2012-06-28 17 views
15

वर्तमान में मैं इस परियोजना पर काम कर रहा हूं जो स्रोत निर्देशिका से फ़ाइलों में से किसी एक में प्रसंस्करण करता है। एक जावा प्रक्रिया है जो निर्दिष्ट निर्देशिका की तलाश में है और यदि वे मौजूद हैं तो फ़ाइलों को पढ़ने और संसाधित करने का प्रयास करती है। फ़ाइलों को छोड़ दिया जाता है और अन्य तृतीय पक्ष प्रक्रिया द्वारा अद्यतन किया जाता है। सवाल यह है कि मैं कैसे जांच सकता हूं कि फ़ाइल पूरी तरह लिखी गई है या नहीं? मैं file.length() का उपयोग करने की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि लेखन प्रक्रिया पूरी नहीं हो पाई है, यह वास्तविक आकार देता है। मुझे एहसास है कि समाधान मंच पर निर्भर होना चाहिए। किसी भी सहायता की सराहना की जाएगी।जांच कर रहा है कि फ़ाइल पूरी तरह से लिखी गई है

अद्यतन: यह सवाल वास्तव में डुप्लिकेट से अलग नहीं है बल्कि यह कोड स्निपेट कि अत्यधिक दर्जा दिया है काम कर के साथ एक जवाब है।

+3

क्या आपने फ़ाइल लॉक का उपयोग करने पर विचार किया है? – cklab

+0

धन्यवाद। यह जांच रहा है क्या हम सुनिश्चित कर सकते हैं कि लॉक हमेशा लेखन प्रक्रिया द्वारा बनाए जाते हैं? –

+2

अच्छा, धारणा यह है कि यदि आप इसे लॉक प्राप्त करने का प्रयास करते हैं, तो आपको अपवाद प्राप्त करना चाहिए। मैं बस इस पर भी आया: http://docs.oracle.com/javase/7/docs/api/java/io/File।एचटीएमएल # कैनवाइट% 28% 2 कभी इसका इस्तेमाल नहीं किया गया लेकिन आप यह देखने के लिए एक शॉट दे सकते हैं कि यह कैसे काम करता है। दिलचस्प लग रहा है। – cklab

उत्तर

9

क्या निर्माता प्रक्रिया समाप्त होने पर फ़ाइल को बंद कर देती है? यदि ऐसा है, तो उत्पादक प्रक्रिया अभी भी उत्पादित होने पर उपभोक्ता प्रक्रिया में एक विशेष लॉक के साथ फ़ाइल खोलने का प्रयास विफल हो जाएगी।

+1

फ़ाइलों को लिनक्स के तहत rsync कमांड का उपयोग करके कॉपी किया गया है, इसलिए मुझे विश्वास है कि यह करता है। अच्छा विचार, अब इसे आजमाएं। –

+0

क्या आप प्रक्रिया को चित्रित करने के लिए एक उदाहरण लिख सकते हैं? –

+0

यह एक बहुत ही उपयोगी सही उत्तर नहीं है :( –

2

मुझे नहीं लगता कि इसके लिए एक सामान्य समाधान है। फ़ाइल आकार की तलाश करना गलत है क्योंकि कुछ एप्लिकेशन किसी भी लिखने वाले कॉल से पहले फ़ाइल आकार सेट कर सकते हैं। लॉकिंग का उपयोग करना संभावना है। इसके लिए लेखक को एक लेखन लॉक (या अनन्य ताला) प्राप्त करने की आवश्यकता होगी। यदि आप लेखक को संशोधित नहीं कर सकते हैं, तो आप ओएस द्वारा प्रदान किए गए टूल्स का उपयोग कर सकते हैं, जैसे कि लिनक्स पर फ्यूसर देखने के लिए एक ऐसी प्रक्रिया है जो अभी भी फ़ाइल तक पहुंचती है।

1

यदि आप एक ही मंच पर इस कोड का उपयोग करने की योजना बना रहे हैं, तो आप NIO's FileLock facility का उपयोग करने में सक्षम हो सकते हैं। लेकिन दस्तावेज़ों को ध्यान से पढ़ें, और ध्यान दें कि कई प्लेटफॉर्म पर, लॉक केवल सलाहकार है।

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

private boolean isCompletelyWritten(File file) { 
    RandomAccessFile stream = null; 
    try { 
     stream = new RandomAccessFile(file, "rw"); 
     return true; 
    } catch (Exception e) { 
     log.info("Skipping file " + file.getName() + " for this iteration due it's not completely written"); 
    } finally { 
     if (stream != null) { 
      try { 
       stream.close(); 
      } catch (IOException e) { 
       log.error("Exception during closing file " + file.getName()); 
      } 
     } 
    } 
    return false; 
} 

धन्यवाद और @Will और अन्य सभी जो "अनन्य लॉक" रास्ते में देखने के लिए सुझाव:

+0

अच्छा बिंदु। धन्यवाद। जावा के साथ कोई सफलता नहीं होने पर यह होगा। कुछ परिस्थितियों के कारण निर्माता व्यवहार को बदलने में थोड़ा मुश्किल है। –

13

मैं समाधान काम कर गया। मैंने लोगों को अन्य लोगों को इसका उपयोग करने के लिए यहां कोड पोस्ट किया है। मेरा मानना ​​है कि @ टिग्रान द्वारा सुझाए गए नामकरण के साथ समाधान भी काम करता है लेकिन शुद्ध जावा समाधान मेरे लिए बेहतर है।

पीएस शुरुआत में मैंने RandomAccessFile के बजाय FileOutputStream का उपयोग किया लेकिन यह फ़ाइल को लिखे जाने से ताला लगा।

+2

यह Winows पर काम करता है लेकिन लिनक्स पर नहीं। – Nilesh

+0

@Nelish इस अजीब है क्योंकि मैं शुरू में लिनक्स –

+0

के लिए लिनक्स पर इसे लागू किया खैर मैं इसे यूनिक्स पर की कोशिश की। एक WinSCP या ftp फ़ाइल स्थानांतरित किया गया था, जबकि मैं लॉक करने के लिए करने की कोशिश की और मैं करने में सक्षम था! – Nilesh

0

आप जावा 1.7 का उपयोग कर सकते हैं, तो NIO उपकरण पर एक नज़र डालें, विशेष रूप से java.nio.channels.FileChannel

here फ़ाइल ताला लगा और इसे पढ़ने का एक उदाहरण है।

1

एक सरल समाधान मैं विंडोज के साथ इस स्थिति के लिए पहले उपयोग किए गए boolean File.renameTo(File) का उपयोग करें और एक अलग मचान फ़ोल्डर में मूल फ़ाइल स्थानांतरित करने के लिए प्रयास करने के लिए है:

तो successfalse, तो है potentiallyIncompleteFile अभी भी लिखा जा रहा है।

+0

विंडोज उपयोगकर्ताओं के लिए अच्छा सुझाव, लेकिन यह मंच-अज्ञेयवादी नहीं है। लिनक्स/यूनिक्स पर आप उन फ़ाइलों को हटा और नाम बदल सकते हैं जो अभी भी अन्य प्रक्रियाओं द्वारा खुले हैं। –

+1

यही कारण है कि मेरा जवाब "विंडोज़ के साथ" और "सभी प्रणालियों के लिए" नहीं कहता है। – JoshDM

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