2011-03-27 2 views
9

मैं वर्तमान में किसी उपयोगकर्ता द्वारा परिभाषित फ़ाइल में फ़ाइल सहेजने वाले कुछ कोड के साथ काम कर रहा हूं। यदि उपयोगकर्ता बिना किसी एक्सटेंशन के फ़ाइल नाम में गुजरता है, तो कोड फ़ाइल प्रकार (आंतरिक रूप से संग्रहीत) के आधार पर एक्सटेंशन को स्वत: पता लगाता है।एक फ़ाइल एक्सटेंशन के भीतर मौजूद रिक्त स्थान हो सकता है?

हालांकि, मुझे यह निर्धारित करने में कठिनाई हो रही है कि कोड में पास किए गए फ़ाइल नाम का विस्तार है या नहीं। मैं Path.HasExtension(filename) और Path.GetExtension(filename) उपयोग कर रहा हूँ, लेकिन यह अजीब व्यवहार का प्रदर्शन किया जा रहा है:

File.EXT =>.EXT विस्तार है। यह ठीक है।

This Is A File.EXT =>.EXT विस्तार है। यह भी ठीक है।

This Is A File. Not An Extension =>. Not An Extension विस्तार है। हालांकि, मैं इसे विस्तार के बिना फ़ाइल के रूप में सोचूंगा। विंडोज़ भी ऐसा सोचता है जब मैं इस नाम के साथ फाइल बनाता हूं (एक अपरिचित विस्तार वाली फाइल बनाने के कारण विंडोज़ इसे EXTENSIONNAME File कहता है, जबकि इस तरह के एक्सटेंशन के बिना फाइलें सिर्फ File कहलाती हैं)।

This Is A File.Not An Extension =>.Not An Extension विस्तार है। उपरोक्त के समान समस्या।

यह भी ध्यान रखें कि यह वही व्यवहार Path.GetFileNameWithoutExtension(filename) में स्पष्ट है (उदाहरण के लिए यह पिछले दो उदाहरणों पर विस्तार के बिना फ़ाइल नाम की रिपोर्ट करता है, केवल This Is A File)।

तो मैं इससे क्या ले रहा हूं यह है कि .NET और Windows एक विस्तार के रूप में जो सोचते हैं उस पर भिन्न होते हैं।


प्रश्न: मैं सोच रहा हूँ अगर यह ठीक है मुझे इस जैसे कोड को लागू करने के लिए:

if(!Path.HasExtension(filename) || Path.GetExtension(filename).Contains(" ")) {...}

के बाद से है कि एक उचित विस्तार के अपने कोड की परिभाषा अधिक खींच होगा विंडोज़ चीजों के साथ कैसे व्यवहार करता है। या क्या मैं यहां कुछ खो रहा हूं जो स्पष्ट रूप से कहता है कि मुझे अपने एक्सटेंशन में रिक्त स्थान की अनुमति देनी चाहिए?

मैंने खोज की है और this slightly similar question पाया है, लेकिन इसमें जुड़े दस्तावेज़ केवल निर्दिष्ट करते हैं कि किसी स्थान/अवधि के साथ एक्सटेंशन को समाप्त करने की अनुशंसा नहीं की जाती है - वे एक्सटेंशन के भीतर रिक्त स्थान के बारे में कुछ भी नहीं कहते हैं।

+0

मैं एक फ़ाइल 'यह एक फ़ाइल बनाने में सक्षम हूं। विंडोज 7 और विंडोज एक्सपी दोनों का उपयोग करके एक एक्सटेंशन नहीं '। फ़ाइल बनाने के लिए मैं डेस्कटॉप, नया, टेक्स्ट दस्तावेज़ 'पर राइट क्लिक करता हूं। या आप नेट का उपयोग कर फाइल बनाने के बारे में बात कर रहे हैं? –

+0

@ थॉमस मैं उन फ़ाइलों को या तो .NET या विंडोज 7 के साथ बना सकता हूं। मेरा मुद्दा यह है कि विंडोज़ फ़ाइल एक्सटेंशन के रूप में "एक्सटेंशन नहीं" को पहचानता है, जबकि .NET करता है। – NickAldwin

उत्तर

9

विंडोज़ में एक फ़ाइल नाम पर विस्तार पूरी तरह से एक सम्मेलन है। GetExtension और HasExtension विधियां केवल फ़ाइल नाम में एक बिंदु की तलाश करें और तदनुसार कार्य करें। आप फ़ाइल नाम (विस्तार सहित) के भीतर कहीं भी रिक्त स्थान डालने के लिए स्वतंत्र हैं।

जब आप कहते हैं कि "विंडोज इतना सोचता है", यह वास्तव में एक्सप्लोरर में कुछ कोड है जो एक्सटेंशन को पार्स करने का प्रयास करता है, और यह बस .NET की तुलना में थोड़ा अलग एल्गोरिदम का उपयोग करता है।

+0

ठीक है, उत्तर के लिए धन्यवाद। मानव दृष्टिकोण से, क्या आप मानते हैं कि उपयोगकर्ता को यह मानना ​​उचित नहीं है कि इसका विस्तार नहीं किया गया है यदि इसमें कोई जगह है? – NickAldwin

+0

आप आसानी से कल्पना कर सकते हैं कि कोई भी ऐसा प्रोग्राम नहीं बनाएगा जो एक्सटेंशन में एक्सटेंशन के साथ एक्सटेंशन का उपयोग करता है, इसलिए एक्सटेंशन में किसी भी स्थान का अर्थ यह होना चाहिए कि यह एक्सटेंशन नहीं है। – Gabe

3

कोई विस्तार नहीं है कि कोई एक्सटेंशन क्या है। आम सम्मेलन यह है कि अंतिम . के बाद सब कुछ विस्तार है।

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

मैं कहूंगा, एक्सटेंशन में रिक्त स्थान को अस्वीकार करें। 999/1000 गुना उपयोगकर्ता का मतलब यह विस्तार के रूप में नहीं था।

Wikipedia on filenames के शब्दों में:

। (डीओटी): अनुमत है लेकिन आखिरी घटना का अर्थ वीएमएस, एमएस-डॉस और विंडोज़ में एक्सटेंशन सेपरेटर के रूप में किया जाएगा। अन्य ओएस में, आमतौर पर फ़ाइल नाम के हिस्से के रूप में माना जाता है, और एक से अधिक पूर्ण स्टॉप की अनुमति दी जा सकती है।

+0

मेरे दोनों सवालों के जवाब देने के लिए धन्यवाद :) – NickAldwin

4

फाइल सिस्टम कैसे नामों को नियंत्रित करता है और कैसे विंडोज शैल (यानी एक्सप्लोरर) फ़ाइल नामों को संभालता है दो अलग-अलग जानवर हैं।

फाइल सिस्टम रिक्त स्थान, बिंदु या कुछ और के बारे में परवाह नहीं करता है - इसके लिए, फ़ाइल नाम केवल एक अपारदर्शी स्ट्रिंग है (अनुमति वर्णों पर कुछ प्रतिबंधों के साथ)। नाम/विस्तार अलगाव सिर्फ एक बना हुआ सम्मेलन है। दूसरी ओर, खोल, अपनी विस्तार की व्याख्या करने के लिए स्वतंत्र है कि एक्सटेंशन क्या है क्योंकि इसका उद्देश्य फ़ाइल जानकारी को स्टोर और पुनर्प्राप्त नहीं करना है बल्कि उपयोगकर्ता को बेहतर अनुभव प्रदान करना है। तो जवाब के लिए वहां मत जाओ।

मैं System.IO विधियों की वापसी के साथ जाने का सुझाव दूंगा (क्योंकि सम्मेलन के बाद अच्छा है), लेकिन यदि आप इसके लिए कोई अच्छा कारण रखते हैं तो आप अपने कोड में जो भी चाहें कर सकते हैं।