2011-03-21 16 views
9

है, मैंने कुछ उत्सुकता में भाग लिया है। मेरे पास एक डिकंपेलर है जो बाइनरी फ़ाइल से जानकारी निकालता है। मैं ऑब्जेक्ट्स की एक श्रृंखला निकालने जा रहा हूं जिसे मुझे अलग-अलग डिस्क पर बाइनरी फाइलों के रूप में लिखने की आवश्यकता है। ये ऑब्जेक्ट्स लाइब्रेरी में संकलित ग्राफिक मॉडल हैं। ऑब्जेक्ट्स में उनमें नाम एम्बेड किए गए हैं और मुझे उस नाम को फ़ाइल नाम के रूप में उपयोग करने की आवश्यकता है।एक फ़ाइल लिखना जिसमें डिवाइस का नाम

मैं उपयोग कर रहा हूँ:

try { 
      // Open file for reading . 
      using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { 
       // Writes a block of bytes to this stream using data from a byte array. . 
       fileStream.Write(byteArray, 0, byteArray.Length); 
       // close file stream . 
       fileStream.Close(); 
      } 
      return true; 
     } 

     catch (Exception exception) { 
      return false; 
     } 

मुझे पता है मेरी अपवाद हैंडलिंग महान नहीं है! हालांकि समस्या तब दिखाई गई जब वस्तुओं में से एक को COM2 नाम दिया गया था, इसका नाम अपवाद था:

फ़ाइलस्ट्रीम डिस्क विभाजन और टेप ड्राइव जैसे Win32 डिवाइस नहीं खोलेंगे।

तो मेरे उदाहरण में मैं COM2.mdl नामक फ़ाइल लिखने की कोशिश कर रहा हूं और यह त्रुटि प्राप्त करता हूं। मैं वास्तव में इन नामों को बदलना नहीं चाहता क्योंकि वे डेवलपर द्वारा एम्बेडेड हैं।

मैंने उन उपकरणों की सूची के खिलाफ नामों का परीक्षण करने पर विचार किया जो त्रुटि का कारण बन सकते हैं - लेकिन मुझे नहीं पता कि यह सूची क्या हो सकती है और इसका मतलब यह भी होगा कि फ़ाइल का नाम बदलना जो मैं नहीं चाहता कर।

तो मेरा प्रश्न: क्या फ़ाइल समस्या के अलावा बाइटरी फ़ाइल के रूप में बाइट सरणी लिखने का कोई तरीका है जो इस समस्या से अधिक हो सकता है?

बहुत धन्यवाद

उत्तर

15

आरक्षित नाम AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN हैं। । किसी Windows कर्नेल, बात से लागू backwards compatibility with CP/M के लिए है यह FAT फ़ाइल सिस्टम पर एक सीमा हो सकती है, हालांकि -

आप इन नामों के साथ फ़ाइलें बनाने के लिए (और किसी भी फाइल सिस्टम पर किसी भी विस्तार, जैसे COM2.txt विंडोज पर साथ में सक्षम नहीं होगा , लेकिन यह कुछ और अधिक जानकारी के लिए NTFS पर नहीं है See Wikipedia

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

echo test > com2.txt 
-> The system cannot find the file specified. 

echo test > \\mypc\c$\Users\Michael\Desktop\com2.txt 
-> works flawlessly 

मैं 100% यकीन है कि अगर UNC पथ नहीं कर रहा हूँ फ़ाइल स्ट्रीम के साथ काम करें, लेकिन निश्चित रूप से उन्हें .NET

में उपयोग करने का एक तरीका है
+1

मैंने फ़ाइलस्ट्रीम के लिए फ़ाइल नाम की शुरुआत में \\? \ जोड़ने की कोशिश की और यह पथ नाम अपवाद में एक अवैध चरित्र लौटा, इसलिए मुझे लगता है कि यूएनसी पथ और फ़ाइलस्ट्रीम – ScruffyDuck

+0

मिश्रण नहीं है आरक्षित शब्दों की सूची के लिए धन्यवाद। अंत में मैंने इस सूची के खिलाफ परीक्षण करने का फैसला किया और यदि नाम प्रत्यय जोड़कर नाम बदलने के लिए है। यह अब तक मेरे उद्देश्य के लिए काफी अच्छा काम करता है। – ScruffyDuck

+2

+1 ग्रेट जानकारी। मैं समझ नहीं पाया कि मैं con.txt नामक फ़ाइल क्यों नहीं बना सका। –

0

लपेटें कॉल आज़माएं/कैच ब्लॉक विशेष रूप से System.ArgumentException को पकड़ने के लिए के साथ "नई FileStream" करने के लिए। यदि आप इसे पकड़ते हैं, तो मान लें कि फ़ाइल नाम अमान्य है और एक अलग फ़ाइल नाम के साथ पुनः प्रयास करें (उदा। फ़ाइल नाम स्ट्रिंग में "foo" प्रीपेन्ड करें)।

इसके अलावा, आप System.IO.Path.GetInvalidPathChars() और System.IO.Path.GetInvalidFileNameChars() का उपयोग कर सकते हैं; "अमान्य वर्ण" की पूरी सूची प्राप्त करने के लिए जो Windows फ़ाइल नाम के अंदर फिट नहीं होंगे। इसलिए आप फ़ाइल बनाने के प्रयास से पहले उन वर्णों को फ़ाइल नाम स्ट्रिंग से बाहर या प्रतिस्थापित कर सकते हैं।

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