2012-12-31 16 views
8

Directory.EnumerateFiles विधि के लिए डिफ़ॉल्ट पढ़ने का आदेश क्या है? क्या यह सुसंगत है?निर्देशिका .EnumerateFiles आदेश पढ़ें (सी #)

मेरे अनुभव में अब तक यह फाइलें बनाई गई थीं, लेकिन मुझे इसकी पुष्टि नहीं मिली है।

कारण मैं पूछता हूं क्योंकि एक प्रोग्राम का हिस्सा मैं निर्देशिकाओं से बाइनरी फ़ाइलों को लोड करने पर काम कर रहा हूं जो बदले में सरणी में लोड होते हैं। ये वस्तुएं सूचकांक के सरणी द्वारा एक-दूसरे को संदर्भित करती हैं, जिसका अर्थ है कि वे अपने सरणी में लोड किए गए क्रम को लगातार बने रहने के लिए (सूचकांक स्थानांतरित करने से बचने के लिए) की आवश्यकता होती है।

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


संपादित करें: अपने जवाब से उत्कृष्ट सुझावों के बाद, मैं एक शब्दकोश फ़ाइलों के नाम का उपयोग करने के लिए दृष्टिकोण पुनर्संशोधित गए हैं। प्रदर्शन प्रभाव काफी नगण्य रहा है और पठनीयता और रखरखाव दोनों काफी सुधार हुए हैं, इसलिए यह काफी अच्छी तरह से काम कर रहा है।

+0

क्यों न केवल सूचकांक के बजाय संदर्भ रखें? यदि आपने ऐसा किया है तो आपको इंडेक्स को शफल होने की चिंता करने की आवश्यकता नहीं होगी। – casperOne

+0

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

+2

[एमएसडीएन] से लिया गया (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), 'गेटफाइल' के बारे में (जो अनिवार्य रूप से 'एन्युमेरेटफाइल' कहता है): * लौटाए गए फ़ाइल नामों का क्रम है गारंटी नहीं है; एक विशिष्ट सॉर्ट ऑर्डर की आवश्यकता होने पर सॉर्ट() विधि का उपयोग करें। * मैं आपको बताता हूं कि दस्तावेज कहता है, अपनी सॉर्टिंग विधि का उपयोग करने के लिए। – Mir

उत्तर

10

जहाँ तक मैं कह सकता हूं, यह दस्तावेज नहीं है - इसलिए यदि आप एक पैटर्न खोज सकते हैं, तो आपको उस पर भरोसा नहीं करना चाहिए। यह .NET के संस्करण, या ऑपरेटिंग सिस्टम के संस्करण पर निर्भर हो सकता है, या बस सर्विस पैक के बीच बदल सकता है। इसके बजाय, अगर आपको कुछ विशिष्ट आदेश की आवश्यकता है, तो आपको इसे स्वयं सॉर्ट करना चाहिए। बेशक दुर्भाग्य से उन्हें संसाधित करने से पहले सभी फ़ाइल नामों की आवश्यकता होती है, लेकिन यह आपको स्थिरता प्रदान करेगी।

हालांकि ईमानदार होने के लिए, ऐसा लगता है कि आपके पास बहुत ही कमजोर डेटा मॉडल है। आपने वास्तव में हमें यह ठीक करने के लिए पर्याप्त नहीं बताया है कि आप इसे ठीक करने के लिए क्या कर रहे हैं, लेकिन Directory.EnumerateFiles के परिणामों के भीतर फ़ाइल की पूर्णांक अनुक्रमणिका का उपयोग निश्चित रूप से सर्वोत्तम दृष्टिकोण नहीं है।

आप फ़ाइल नाम बजाय सूचकांक उपयोग किया है, कि के रूप में आप उन्हें पढ़ते हैं, संभवतः आप फ़ाइलों को प्रोसेस करने की अनुमति होगी - लेकिन वहाँ अच्छी तरह से और भी बेहतर दृष्टिकोण, तुम क्या करने की कोशिश कर रहे बातों के आधार पर हो सकता है। नाम का उपयोग करना अभी भी सस्ता होना चाहिए - यह केवल एक पूर्णांक के बजाय एक एकल स्ट्रिंग संदर्भ होगा, और यदि यह कई स्थानों पर उपयोग किया जाता है, तो यह उसी स्ट्रिंग ऑब्जेक्ट के कई संदर्भ होंगे।

4

प्रलेखन आदेश निर्दिष्ट नहीं करता है, लेकिन आप हमेशा LINQ के OrderBy फ़ंक्शन को नियोजित करके इच्छित आदेश को मजबूर कर सकते हैं।

आप वास्तव में सरणी से आइटम को हटाने के बजाय null पर संदर्भों को साफ़ करके इंडेक्स परिवर्तनों को छोड़ सकते हैं। यहां ट्रेडऑफ यह है कि अब आपको यह जांचना होगा कि दिए गए इंडेक्स में आइटम null है या नहीं।

यदि आपके पास Dictionary पर आधारित एक और अधिक पठनीय डेटा संरचना है, तो इसे स्विच करने पर विचार करें और दक्षता संबंधी चिंताओं को अनदेखा करें जब तक कि आपका प्रोफाइलर आपको बताए कि आपको अपने कोड के इस विशेष भाग को अनुकूलित करना होगा।

13

.NET द्वारा उपयोग किया जाने वाला अंतर्निहित Win32 API FindFirstFile और FindNextFile है।documentation specifically states:

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

तो नहीं, आप फ़ाइलों को वापस आने के आदेश की गारंटी नहीं दे सकते। अन्य उत्तर इस व्यवहार के आसपास काम करने के लिए पर्याप्त तरीके प्रदान करते हैं।

+0

धन्यवाद। उपयोगी! – Shimmy

+0

मुझे यह तकनीकी विवरण और लिंक पसंद है। – Gqqnbig

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