2013-01-09 23 views
5

मुझे हमारे सी # प्रोजेक्ट में एक अजीब समस्या है जो आयरनपीथन लिपि के माध्यम से निर्देशिका बनाने की कोशिश करते समय होती है।IOException ("फ़ाइल या निर्देशिका पहले से मौजूद है") निर्देशिका बनाने की कोशिश करते समय

targetTemplateDirectory = Path.Combine(Data, "Templates\\CheckedReports") 

if not Directory.Exists(targetTemplateDirectory): 
    Directory.CreateDirectory(targetTemplateDirectory) 

समस्या मुझे बता कि यह संभव फ़ोल्डर "H:\ProductName\Data\Templates\CheckedReports" बनाने के लिए क्योंकि एक फ़ाइल या एक ही नाम के साथ निर्देशिका पहले से मौजूद नहीं है एक IOException है: यह कोड है।

एमएसडीएन के अनुसार विधि Directory.CreateDirectory() निर्देशिका पहले से मौजूद होने पर कोई अपवाद नहीं फेंकती है।

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

क्या इस अपवाद के लिए एक ही नाम वाली फ़ाइल के अलावा अन्य अपवाद होने की कोई संभावना है? शायद अनुमतियों, हटाने योग्य मीडिया या नेटवर्क ड्राइव से संबंधित कुछ?

+0

"लेकिन यह बहुत ही असंभव है" ... अभी तक, उपलब्ध जानकारी दी गई है, यह सबसे संभावित कारण है। यदि आप उस नाम की एक फ़ाइल मौजूद हैं तो क्या आप बस जांच नहीं सकते (या ग्राहक की जांच कर सकते हैं)? –

+0

मेरी इच्छा है कि मैं कर सकता हूं :)। इस संस्करण का उपयोग करने वाले एप्लिकेशन संस्करण में एक त्रुटि रिपोर्टिंग सिस्टम है जो किसी भी व्यक्तिगत या संपर्क जानकारी की अनुमति नहीं देता है। हमने बाद में अपडेट में बदल दिया। इसलिए हमें केवल एक संदेश मिला जिसमें स्टैक ट्रेस और मशीन आईडी है, और कुछ भी नहीं। –

उत्तर

3

हमारे पास समान था, और हमारे मामले में यह स्पष्ट था कि यह एक अनुमति मुद्दा था। हम दस्तावेजी अनधिकृत एक्सेस अपवाद की अपेक्षा कर रहे थे, लेकिन यह हमें नहीं मिला।

ढेर में हमारे पास Directory.CreateDirectory कॉलिंग निर्देशिका है .InternalCreateDirectory।

 //Note that InternalExists may fail due 
     // to Win32 ACL's preventing us from seeing a directory, and this 
     // isn't threadsafe. 

इसके बारे में अधिक नोट, कि उस तथ्य में गहरी जाना कर रहे हैं, कोड निर्देशिका पहले से ही वहाँ है कि जब यह नहीं देख सकता था बनाने की कोशिश कर सकते हैं:

इसके अंदर इस नोट है ।

5

हालांकि यह केवल एक उपयोगकर्ता के लिए एक ओवरकिल होगा, यह जांचना संभव होना चाहिए कि उस नाम वाली फ़ाइल मौजूद है या नहीं।

FileInfo myFile = new FileInfo(targetTemplateDirectory); 
if (myFile.Exists) 
    myFile.Delete(); 

if (!Directory.Exists(targetTemplateDirectory)) 
    Directory.CreateDirectory(targetTemplateDirectory); 

शायद इस समस्या को हल बिल्कुल अगर मैं/हे अपवाद एक ही नाम होने के लिए एक फ़ाइल के कारण हुई थी होगा। यदि यह उपयोगकर्ता के कारण होगा क्योंकि "नेटवर्क नाम ज्ञात नहीं है", तो मेरे पास कोई सुराग नहीं होगा।

+0

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

+0

यह एकमात्र समाधान है (कई में से) जो मेरे लिए काम करता है। –