2012-08-16 13 views
5

क्या string[] कहने के लिए आपूर्ति की गई रूट निर्देशिका से शुरू होने वाली प्रत्येक फ़ाइल (जिसे आपने एक्सेस पढ़ा है) के पूर्ण योग्यता वाले पथ में लोड करने का एक त्वरित तरीका है?निर्देशिका पर प्रगति की रिपोर्टिंग। गेटफाइल

मैं System.IO.Directory.GetFiles देखा, लेकिन इससे पहले कि आप इनपुट SearchOption.AllDirectories करने की अनुमति है एक फिल्टर की आपूर्ति करने के लिए है, तो मैं करने की कोशिश की:

string[] directoryList = Directory.GetFiles(RootPath, "*.*", 
              SearchOption.AllDirectories); 

कहाँ RootPath मेरी मान्य, निहित निर्देशिका है। यह ठीक काम करता प्रतीत होता है, सिवाय इसके कि यह मेरे विंडोज़ फॉर्म ऐप को बहुत लंबे समय तक लटका देता है जब इसे 2 9 जीबी की एक बड़ी निर्देशिका/फ़ाइल संरचना और कुछ सौ हजार फाइलों पर इंगित करता है।

तो मैं एक BackgroundWorker ताकि मेरे जीयूआई बंद नहीं दिखाई थी के माध्यम से इसे सूत्रण के बारे में सोचा है, लेकिन मुझे यकीन है कि कैसे मैं एक ProgressBar के लिए कुछ इस तरह के लिए प्रगति की रिपोर्ट चाहते हैं, क्योंकि यह सिर्फ एक बयान है कि कर रहा है है नहीं कर रहा हूँ लोडिंग और मुझे फाइलों की कुल संख्या के बारे में कोई जानकारी नहीं है, या जिस नंबर पर पहले से संसाधित किया गया है, उस पर कोई जानकारी नहीं है।

उत्तर

8

Directory.GetFiles के साथ, आप हमेशा तब तक अवरुद्ध रहेंगे जब तक कि सभी परिणाम पूरी तरह से संसाधित नहीं हो जाते हैं, जो एक एक बड़ी निर्देशिका संरचना पर लंबे समय तक।

आप Directory.GetFiles के बजाय Directory.EnumerateFiles का उपयोग कर सकते हैं। यह परिणामों को एक सरणी के बजाय IEnumerable<string> के रूप में लौटाता है, ताकि आप परिणाम तुरंत प्रसंस्करण (या प्रगति की रिपोर्टिंग) शुरू कर सकें।

अन्यथा, सबसे अच्छा विकल्प Directory.GetFiles का उपयोग करना है, लेकिन SearchOption.AllDirectories नहीं है। फिर आप रिकर्सन को संभालने के लिए Directory.GetDirectories का उपयोग कर सकते हैं, और परिणामों को चरणों में पार्स कर सकते हैं।

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