2012-01-10 6 views
8

मैं एक आवेदन है कि एक निर्देशिका के भीतर फ़ाइलों की सामग्री पटरियों में एक आवर्ती समस्या का सामना कर रहा हूँ, जावा 7 WatchService API पर आधारित पहले अन्य प्रक्रिया द्वारा अवरोधित नहीं है। जब अंतर्निहित फ़ाइल सिस्टम फ़ाइल पर एक संशोधन घटना को सक्रिय करता है, तो मैं तुरंत अपने SHA-256 की गणना करना चाहता हूं।जावा मैं/हे: एक फ़ाइल सुनिश्चित करें किसी भी आर/डब्ल्यू आपरेशन

लेकिन यह अक्सर तब होता है किसी अन्य प्रक्रिया फ़ाइल को खोला (अर्थात Word) है, इस प्रकार एक विशेष ताला हिरासत में लिया गया है और किसी भी पढ़ें/लिखें आपरेशन से मेरे ऐप को रोकने। किसी भी स्ट्रीम/चैनल खोला फ़ाइल के खिलाफ बनाया गया है तो एक FileNotFoundException या NIO एपीआई के लिए एक FileSystemException की तरह एक संदेश के साथ फेंक दिया जाता है:

प्रक्रिया फ़ाइल तक नहीं पहुँच सकता है क्योंकि यह अन्य प्रक्रिया द्वारा किया जा रहा है

मैं ऐसे समाधान के साथ आने में सक्षम नहीं था जो "असली" FileNotFoundException को मास्क किए बिना ऐसे मामलों का पता लगाएगा जब फ़ाइल वास्तव में fs पर मौजूद नहीं है।

मैं फ़ाइल.एक्सिस्ट्स के माध्यम से अस्तित्व की जांच करने के विचार के साथ आया हूं और फिर यदि कोई स्ट्रीम खोलने पर फ़ाइल नॉटफाउंड अपवाद फेंक दिया जाता है तो मैं अनुमान लगा सकता हूं कि फ़ाइल लॉक है। मैं इस पर किसी भी इनपुट के लिए खुला हूँ!

धन्यवाद!

+0

कभी भी इस का समाधान खोजने? –

+0

मैं, अनुमानी उल्लेख का उपयोग कर यदि File.exists FileNotFoundException कैच ब्लॉक मैं बंद कर दिया एक फ़ाइल के रूप में व्याख्या के भीतर सच रिटर्न समाप्त हो गया। – sylvain

उत्तर

1

आप फ़ाइल अपने आप को ताला लगा की कोशिश की है? मुझे लगता है कि अगर आप लॉक नहीं हैं और मौजूद हैं तो आप केवल लॉक प्राप्त कर सकते हैं।

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

+0

मैं tryLock() को कॉल करने में सक्षम नहीं था क्योंकि जब मैं RandomAccessFile या FileOutputStream के माध्यम से FileChannel प्राप्त करने का प्रयास करता हूं तो उल्लिखित अपवाद फेंक दिए जाते हैं। – sylvain

+0

उस मामले में यह लग रहा है कि आप अपवाद है जो जब आप इन फ़ाइलों का उपयोग करने का प्रयास फेंक दिया जाता है की जाँच करने के लिए है की तरह। मुझे tryLock का बिंदु दिखाई नहीं देता है अगर फ़ाइल लॉक होने पर आप इसे कॉल नहीं कर सकते हैं। –

+1

मेरा अनुमान है कि मूल अनुप्रयोगों में JVM के भीतर उपलब्ध लोगों की तुलना में अधिक प्रतिबंधक ताले हो सकते हैं। – sylvain

0

दस्तावेज़ साझा करने पर समन्वयित प्रक्रियाओं विशेष रूप से मुश्किल है जब समर्पित फाइल सिस्टम का उपयोग नहीं (GFS हो सकता है) की तरह .. मुझे नहीं लगता है कि जावा ताला लगा एपीआई आप बहुत मदद मिल सकती है, मुझे लगता है कि आप कर रहे हैं ट्राई/असफल रणनीति के अपने विचार के साथ सही तरीके से ... आप एक WatchService इस्तेमाल कर सकते हैं फ़ाइल परिवर्तन नजर रखने के लिए और उसके बाद के रूप में अपने व्यापार की आवश्यकताओं द्वारा कहा गया अभिनय जावा 7 का उपयोग करने ... आप प्रणाली किस तरह का प्रयोग करते हैं? विंडोज अनंत काल के दौरान फ़ाइलों पर हैंडल रखता है ...

HTH जेरोम

+0

वास्तव में मेरे पास पहले से ही विंडोज़ पर चलने वाले एफएस कार्यक्रमों के लिए वॉच सर्विस सर्विस थ्रेड है। वैसे भी मुझे पता था कि उन लॉक की गई फ़ाइलों तक पहुंचने का कोई तरीका नहीं होगा, लेकिन मुझे आश्चर्य है कि java.io या java.nio के भीतर उनकी पहुंच का परीक्षण करने के लिए कोई एपीआई नहीं है। – sylvain

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