2016-01-08 6 views
5

मैं एक कमांड लाइन उपयोगिता बना रहा हूं जो उप-निर्देशिका/फ़ाइलों को हटा देगा। यदि कोई फ़ाइल उपयोग में है, तो System.IO.IOException फेंक दिया गया है। मैं अपने लूप के अंदर एक कोशिश-पकड़ ब्लॉक का उपयोग करता हूं।क्या यह एक लूप लूप में एक कोशिश-पकड़ रखने का बुरा अभ्यास है?

प्रश्न:

यह 1.Is खराब व्यवहार का पाश के लिए एक के भीतर एक कोशिश पकड़ के लिए?

2. यदि हाँ, बेहतर विकल्प क्या है?

मेरे कोड:

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

    foreach (FileInfo file in di.GetFiles()) 
    { 
     try 
     { 
      file.Delete(); 
     } 
     catch(System.IO.IOException) 
     { 
      Console.WriteLine("Please Close the following File {0}", file.Name); 
     } 

    } 
+0

संदेश मानता है कि विफलता इसलिए है क्योंकि फ़ाइल खोली गई है। अगर किसी अन्य कारण से फ़ाइल को हटाया नहीं जा सकता है तो क्या होगा? –

+0

@EricLippert - मैं बिल्कुल सोच रहा था, लेकिन, मुझे यकीन है कि कैसे आगे बढ़ना है। अगर किसी अन्य कारण से फ़ाइल को हटाया नहीं जा सकता है तो आप कैसे संभालेंगे? –

+0

ठीक है, पहले, तय करें कि कोई परवाह करता है या नहीं। अगर कोई परवाह नहीं करता है, तो इसके बारे में तनाव न करें। अगर कोई परवाह करता है, तो अगली बात यह तय करना है कि उन्हें कैसे बताना है। कंसोल आउटपुट शायद एक अच्छा तरीका है, शायद नहीं। बाकी कार्यक्रम को समझने के बिना कहना मुश्किल है। करने के लिए अगली बात यह तय करना है कि उन्हें क्या कहना है। उन्हें सच बताएं: "फ़ाइल blah.txt हटाया नहीं जा सका"। अधिक संदर्भ जोड़ने के लिए अपवाद से संदेश देने पर विचार करें। लेकिन सच्चाई जो आप यहां जानते हैं वह यह है कि फ़ाइल को हटाया नहीं जा सका, इसलिए इसके साथ शुरू करें। –

उत्तर

14

नहीं यह काफी उपयोगी हो सकता है। उदाहरण के लिए: अगर आप अपवाद को फेंकने पर लूप को पूरी तरह से बंद नहीं करना चाहते थे, या यदि अतिरिक्त कोड था जो अपवाद के कारण वर्तमान पुनरावृत्ति के लिए नहीं चलाया जाना चाहिए तो आप निम्न की तरह कुछ कर सकते हैं।

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

foreach (FileInfo file in di.GetFiles()) 
{ 
    try 
    { 
     file.Delete(); 
    } 
    catch(System.IO.IOException) 
    { 
     Console.WriteLine("Please Close the following File {0}", file.Name); 
     continue; 
    } 
    // 
    // Other Code 
    // 
} 

इस तरह से आप की समीक्षा करने के त्रुटि लॉग इन कर सकते बाद में, लेकिन अभी भी आप क्या कार्रवाई करने के लिए कोशिश कर रहे थे के बाकी की प्रक्रिया।

+0

आप रीबूट पर फ़ाइल को हटाने जैसे कुछ करने के लिए इस पकड़ का उपयोग भी कर सकते हैं। http://stackoverflow.com/questions/6077869/movefile-function-in-c-sharp-delete-file-after-reboot –

+0

@Mac - कोड के लिए बहुत धन्यवाद, और मेरे प्रश्न का उत्तर देने के लिए। –

+2

'जारी रखें' यहां अनिवार्य है; आप पहले से ही लूप के शरीर के अंत में हैं, इसलिए 'जारी रखें' कुछ भी खत्म नहीं हो रहा है। – Servy

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