2013-01-12 13 views
10

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

मैं विंडोज 7

पर JDK 7u10 के साथ इस समस्या का अनुभव किया है निर्देशिका ताला लगा या रूट के सभी निर्देशिकाओं देख के बिना आप इस समस्या के लिए किसी भी तरीके को जानते हैं?

अद्यतन

लिनक्स पर मैं एक ही व्यवहार देखा है।

अब तक ऐसा लगता है कि मेरे पास अब तीन विकल्प हैं।

1) उपयोगकर्ता के अनुशासन पर निर्भर है कि वह डेटा निर्देशिकाओं को स्थानांतरित नहीं करेगा। मुझे वास्तव में यह विकल्प पसंद नहीं हैं क्योंकि इससे अपरिभाषित व्यवहार हो सकता है।

2) और अधिक व्यापक अमानक देशी पुस्तकालय

3) बेहतर निर्देशिकाओं पर नजर रखने वाले की पदानुक्रम बनाएं का प्रयोग करें। यह इस घटना के बाद केवल ENTRY_DELETE ईवेंट स्वीकार करेगा (या OVERFLOW) वास्तविक दृश्य निर्देशिका को स्थानांतरित या हटाए जाने के समय प्रकट होना चाहिए और इस प्रकार अमान्य।

+0

जावाडोक यह बताता है कि यह है कि के लिए मूल रूप से उपलब्ध तंत्र का उपयोग करता है, तो आप की कोशिश की और कैसे खोज करते Win7 के तंत्र इस मामले में कार्य करता है है ? – fge

+0

विंडोज़ पर मूल तंत्र निर्देशिका हैंडल का उपयोग करता है जो निर्देशिका का नाम बदलकर/स्थानांतरित होने पर बदला नहीं जाता है लेकिन विशिष्ट घटना भेजी जाती है। यह कोई मुद्दा नहीं होगा लेकिन जावा में मुझे इन विंडोज़ विशिष्ट घटनाओं का पता लगाने का कोई तरीका नहीं दिखता है और न ही वास्तविक निर्देशिका संभाल मूल्य प्राप्त करने और जांचने का कोई तरीका नहीं है। – rjezek

उत्तर

6

मेरी समझ यह है कि एक निर्देशिका का नाम बदलना पुरानी और नई मूल निर्देशिकाओं पर फ़ाइल सिस्टम घटनाओं को उत्पन्न करेगा, जिसका नाम बदल दिया गया है। Can iNotify tell me where a monitored file is moved? के उत्तर के अनुसार, ओएस आपको यह नहीं बता सकता कि जब तक आप गंतव्य निर्देशिका की निगरानी नहीं कर रहे हैं तब तक कुछ स्थानांतरित किया गया था। (और इसके अलावा, जावा में 7/8 चाल घटनाओं घड़ी सेवा कार्यान्वयन द्वारा नियंत्रित नहीं कर रहे हैं।)

अद्यतन

आप jpathwatch परियोजना है कि (platform specific) बढ़ाया का उपयोग कर की घटनाओं के लिए समर्थन जोड़ता है की कोशिश कर सकते मानक जावा 7 WatchService एपीआई।

संदर्भ:

+0

ठीक है, मुझे वास्तव में यह जानने की ज़रूरत नहीं है कि मेरी निर्देशिका कहां स्थानांतरित की गई थी। यह जानना ठीक होगा कि यह स्थानांतरित हो गया था इसलिए मैं नई स्थिति के अनुसार वॉचकी पंजीकरण बदल सकता हूं। मैंने जेआरई कार्यान्वयन की जांच की है और ऐसा लगता है कि वे सिर्फ इन घटनाओं को सिस्टम से फेंक देते हैं।अभी तक ऐसा लगता है कि वर्तमान कार्यान्वयन के साथ इसे संभालने का एकमात्र तरीका रूट पर सभी निर्देशिकाओं को देखना है। यह बहुत सुंदर नहीं दिखता है, फिर भी मुझे लगता है कि मैं इसे इस तरह हल कर सकता हूं या आपके पास कोई बेहतर विचार है? – rjezek

+0

[KEY_INVALID] के अनुसार [http://jpathwatch.sourceforge.net/name/pachler/nio/file/ext/ExtendedWatchEventKind.html#KEY_INVALID) jpathwatch लाइब्रेरी में ऐसा लगता है कि यह एक अलग विंडोज समस्या है क्योंकि अन्य सिस्टम वॉचकी को अमान्य करते हैं जब यह स्थानांतरित हो जाता है। दरअसल, सवाल यह है कि मानक जावा 7 वॉच सर्विस इस तरह काम करता है, इसलिए मैं लिनक्स पर अपने व्यवहार का और शोध कर दूंगा और यहां अपने परिणाम डालूंगा। – rjezek

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