2013-08-08 17 views
10

DirectoryStream के प्रलेखन स्पष्ट रूप से एक निर्देशिका की सामग्री को बदलने:पुनरावृत्ति एक DirectoryStream और एक ही समय

इटरेटर दुर्बलता से संगत है। यह थ्रेड सुरक्षित है लेकिन पुनरावृत्ति करते समय निर्देशिका को फ्रीज नहीं करता है, इसलिए यह निर्देशिका ( ) निर्देशिका के बाद होने वाली निर्देशिका के लिए निर्देशिका को अद्यतन कर सकता है (या नहीं)।

मेरी मशीन पर, मैंने डीबग मोड में निर्देशिका पर एक सरल पुनरावृत्ति निष्पादित की। पुनरावृत्ति पूरा होने से पहले, मैंने निष्पादन तोड़ दिया, निर्देशिका में एक फ़ाइल को फिर से शुरू किया गया और फिर से शुरू किया गया। पुनरावृत्ति को अतिरिक्त फ़ाइल दिखाई नहीं दे रही थी।

मेरा प्रश्न: किस परिस्थिति में पुनरावृत्ति निर्देशिका सामग्री के अपडेट को दर्शाता है? दुर्भाग्यवश औपचारिक दस्तावेज इसके बारे में बहुत अस्पष्ट है। कम से कम कहने के लिए।

+2

मुझे नहीं पता, लेकिन जिस तरह से मैंने इसे पढ़ा है, यह नोडेटर्मेनिस्टिक है, और अंतर्निहित ओएस/एफएस और विशिष्ट कार्यान्वयन पर निर्भर हो सकता है। मेरा सबसे अच्छा अनुमान यह है कि यह अपडेट को प्रतिबिंबित करेगा यदि आपकी निर्देशिका एक इनोड पर है जो बाद में पेड़ में स्थित है, तो इटेटरेटर इंगित कर रहा है। इस व्यवहार को कैसे उत्तेजित करें मुझे नहीं पता। मुझे यह कहते हुए विश्वास है कि यह शुद्ध जावा का उपयोग कर तुरंत (संभवतः एक निर्धारक तरीके से) नहीं है। –

उत्तर

4

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

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

+0

मैं पूरी तरह से निष्कर्ष से सहमत हूं, सवाल अकादमिक हित से बाहर था। – Vitaliy

2

DirectoryStream एक इंटरफ़ेस है, और चूंकि एनआईओ 2 का यह हिस्सा प्लग करने योग्य है, लिनक्स और विंडोज के लिए जेडीके के साथ शिप करने वाले कार्यान्वयन पर विचारों को सीमित न करें। वास्तव में उस व्यवहार के साथ एक कस्टम कार्यान्वयन लिखना, या एक क्लस्टर या वितरित कार्यान्वयन के लिए एक साइड इफेक्ट के रूप में व्यवहार करना संभव होगा।

प्रलेखन जानबूझकर अस्पष्ट है, और के तहत POSIX readdir जो also intentionally vague है प्रतिनिधियों यह:

एक फ़ाइल opendir से हटा या हाल ही में कॉल के बाद निर्देशिका में शामिल कर रहा है, तो() या rewinddir (), क्या readdir_r() को बाद में कॉल करने के लिए उस फ़ाइल के लिए एक प्रविष्टि लौटाई गई है निर्दिष्ट नहीं है।

हालांकि, अगर आप एक ठोस मामले में जहां एक कार्यान्वयन कि अस्पष्टता पर भरोसा करने के बाद कर रहे हैं, तो Linux ext3 readdir and concurrent updates एक मामले में जहां rsync, उच्च मात्रा के साथ एक ext3 फाइल सिस्टम पर, फ़ाइलें बाहर निर्देशिका में प्रदर्शित देखने के लिए दिखाई दिया चलता ऑर्डर वे बनाए गए थे।

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