2011-10-13 14 views
5

मैं नीचे दिए गए कोड का उपयोग करके अपने कंप्यूटर पर फ़ाइलों के माध्यम से गणना करने की कोशिश कर रहा हूं लेकिन हर बार जब यह फ़ाइल या डीआईआर को हिट करता है तो मुझे इसे पढ़ने की अनुमति नहीं है, इसे अपवाद फेंकता है। क्या अपवाद फेंकने के बाद मैं खोज जारी रख सकता हूं? मुझे पता है कि कुछ लोगों के पास समान समस्याएं हैं लेकिन क्या प्रत्येक फ़ाइल/फ़ोल्डर को अलग-अलग जांचने के अलावा ऐसा करने का कोई अन्य तरीका है?अपवाद को फेंकने वाली फाइलें

try 
{ 
string[] files = Directory.GetFiles(@"C:\", "*.*",SearchOption.AllDirectories); 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 
} 
catch 
{ 
} 

किसी भी मदद के लिए धन्यवाद क्योंकि यह मुझे पागल कर रहा है!

उत्तर

10

मैं आज भी एक ही समस्या में आया था। मैंने निम्नलिखित कोड को एक साथ हैक किया। यदि आप इसे वास्तविक उत्पाद में उपयोग करना चाहते हैं तो आपको त्रुटि प्रबंधन में सुधार करने की आवश्यकता हो सकती है। चूंकि यह एक शॉट वाली स्क्रिप्ट के लिए था, इसलिए मुझे बहुत परवाह नहीं था।

static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*") 
{ 
    var todo = new Queue<string>(); 
    todo.Enqueue(root); 
    while (todo.Count > 0) 
    { 
     string dir = todo.Dequeue(); 
     string[] subdirs = new string[0]; 
     string[] files = new string[0]; 
     try 
     { 
      subdirs = Directory.GetDirectories(dir); 
      files = Directory.GetFiles(dir, pattern); 
     } 
     catch (IOException) 
     { 
     } 
     catch (System.UnauthorizedAccessException) 
     { 
     } 

     foreach (string subdir in subdirs) 
     { 
      todo.Enqueue(subdir); 
     } 
     foreach (string filename in files) 
     { 
      yield return filename; 
     } 
    } 
} 

इसका इस्तेमाल करने के लिए आप या तो:

string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

जो पहले सभी फ़ाइलें, स्टोर स्मृति में सभी फ़ाइल नाम और उसके बाद ही उन्हें प्रदर्शित करता है विश्लेषण करता है। वैकल्पिक रूप से आप कर सकते हैं:

IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

कौन सा है, जबकि गणना और इस तरह एक ही समय में स्मृति में सभी फ़ाइल नाम रखने के लिए की जरूरत नहीं है लिखता है।

+0

बहुत अच्छा है, आपका कोड साझा करने के लिए बहुत बहुत धन्यवाद। मैं काम नहीं कर सकता कि यह कैसे काम कर रहा है, मैं सी # के साथ बहुत अनुभवी नहीं हूँ। मैंने इसे एक विधि के रूप में बुलाए जाने की कोशिश की कि स्ट्रिंग रूट और स्ट्रिंग पैटर्न तर्क होगा लेकिन कोई भाग्य नहीं है, मैं सिर्फ कंसोल के साथ कंसोल पर आउटपुट करना चाहता हूं। राइटलाइन(), मैं इसे कहां फिट कर सकता हूं? धन्यवाद! –

+0

मेरी इच्छा है कि मैं आपको +100 दे सकता हूं! यह पूरी तरह से काम किया, बहुत बहुत धन्यवाद! –

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