Windows और Linux निर्देशिका नामों में कौन से वर्ण निषिद्ध हैं?


356

मुझे पता है कि / लिनक्स में अवैध है, और विंडोज में अवैध हैं (मुझे लगता है) * . " / \ [ ] : ; | ,

मैं और क्या भुल रहा हूं?

हालांकि, मुझे एक व्यापक गाइड की आवश्यकता है, और एक जो डबल-बाइट पात्रों को ध्यान में रखता है। बाहरी संसाधनों से जुड़ाव मेरे साथ ठीक है।

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


13
आपके वर्णों में से कुछ वास्तव में विंडोज पर अनुमत हैं। इसे देखें:echo abc > "ab.;,=[1]"
dolmen

3
यह भी मत भूलना <और> विंडोज पर अवैध हैं।
Parker

4
/ लिनक्स में अवैध नहीं है। आपको बस इसे टाइप करते समय \
डेविड सी। बिशप

5
@ DavidC.Bishop: यह एसओ बताता है कि लिनक्स कर्नेल आपको स्लैश वाले फ़ाइलनाम के साथ काम करने से रोकेगा। क्या आप इसे काम करने में सक्षम हैं?
सोरेन ब्योर्नस्टैड

15
"लिनक्स में गैरकानूनी नहीं है। आपको बस इसे टाइप करते समय इसे बचाना होगा" - यह कथन पूरी तरह से गलत है। फ़ाइल नाम घटकों में / शामिल नहीं हो सकता है, और इससे बचने का कोई प्रभाव नहीं है।
जिम बाल्टर

जवाबों:


216

निषिद्ध फ़ाइल नाम वर्णों का एक "व्यापक मार्गदर्शिका" विंडोज पर काम नहीं करने वाला है क्योंकि यह फ़ाइल नाम के साथ-साथ पात्रों को भी रखता है। हां, जैसे पात्र * " ?और अन्य मना किए जाते हैं, लेकिन कई अनंत नाम हैं जो केवल वैध वर्णों से बने हैं जो निषिद्ध हैं। उदाहरण के लिए, रिक्त स्थान और बिंदु वैध फ़ाइल नाम वर्ण हैं, लेकिन केवल उन वर्णों से बना नाम निषिद्ध हैं।

Windows अपर-केस और लोअर-केस वर्णों के बीच अंतर नहीं करता है, इसलिए Aयदि आप एक नाम वाला फ़ोल्डर नहीं बना सकते हैंa पहले से मौजूद । इससे भी बदतर, प्रतीत होता है, जैसे नाम PRNऔर CON, और कई अन्य, आरक्षित हैं और अनुमति नहीं है। विंडोज में कई लंबाई प्रतिबंध भी हैं; एक फ़ोल्डर में मान्य फ़ाइल नाम किसी अन्य फ़ोल्डर में ले जाए जाने पर अमान्य हो सकता है। फ़ाइलों और फ़ोल्डरों के नामकरण के नियम Microsoft डॉक्स पर हैं।

सामान्य रूप से, आप Windows निर्देशिका नाम बनाने के लिए उपयोगकर्ता-जनित पाठ का उपयोग नहीं कर सकते। यदि आप उपयोगकर्ताओं को अपनी इच्छानुसार कुछ भी नाम देना चाहते हैं, तो आपको सुरक्षित नाम बनाने होंगेA , AB, A2एट अल।, दुकान उपयोगकर्ता जनित नाम और एक आवेदन डेटा फ़ाइल में उनके रास्ते समकक्ष, और अपने आवेदन में पथ मानचित्रण प्रदर्शन करते हैं।

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


11
MSDN लिंक का मुख्य वाक्यांश "[और a] ny अन्य वर्ण है जो लक्ष्य फ़ाइल सिस्टम अनुमति नहीं देता है"। विंडोज पर अलग-अलग फाइल सिस्टम हो सकते हैं। कुछ यूनिकोड की अनुमति दे सकते हैं, अन्य नहीं। सामान्य तौर पर, किसी नाम को मान्य करने का एकमात्र सुरक्षित तरीका इसे लक्ष्य डिवाइस पर आज़माना है।
एड्रियन मैकार्थी

72
कुछ दिशा-निर्देश हैं, और "केवल मान्य वर्णों से बना नामों की एक अनंत संख्या है जो निषिद्ध हैं" रचनात्मक नहीं है। इसी तरह "विंडोज अपर-केस और लोअर-केस कैरेक्टर्स के बीच अंतर नहीं करता है" एक मूर्खतापूर्ण अपवाद है - ओपी सिंटैक्स के बारे में पूछ रहा है और शब्दार्थ नहीं, और कोई भी राइट-माइंडेड लोग यह नहीं कहेंगे कि फ़ाइल नाम अमान्यA.txt था क्योंकि वह मौजूद हो सकता है। a.TXT
बोरोडिन

9
COPY CON PRNइसका मतलब है कि कीबोर्ड इनपुट या संभावित स्टड से पढ़ें, और इसे प्रिंटर डिवाइस पर कॉपी करें। यह सुनिश्चित नहीं है कि यह अभी भी आधुनिक खिड़कियों पर मान्य है, लेकिन निश्चित रूप से लंबे समय से था। पुराने दिनों में आप इसका इस्तेमाल टेक्स्ट टाइप करने के लिए कर सकते थे और इसमें डॉट-मैट्रिक्स प्रिंटर होता है, बस इसे आउटपुट करते हैं।
एंटोनप्रिटेक

6
"रचनात्मक नहीं है" - इसके विपरीत, यह एक तथ्य है। क्या रचनात्मक नहीं है बोरोडिन का जुझारूपन।
जिम बाल्टर

3
"आप सामान्य रूप से, Windows निर्देशिका नाम बनाने के लिए उपयोगकर्ता-जनित पाठ का उपयोग नहीं कर सकते हैं।" <- यदि आप ऐसा करना चाहते हैं, तो आप बस एक चरित्र श्वेत सूची हो सकते हैं और यह काफी हद तक काम करेगा, यदि आप पहले से मौजूद समस्या को अनदेखा कर सकते हैं।
केसी

533

आइए इसे सरल रखें और पहले प्रश्न का उत्तर दें।

  1. निषिद्ध मुद्रण योग्य ASCII वर्ण हैं:

    • लिनक्स / यूनिक्स:

      / (forward slash)
      
    • खिड़कियाँ:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. गैर-मुद्रण योग्य वर्ण

    यदि आपका डेटा किसी ऐसे स्रोत से आता है जो गैर-मुद्रण योग्य वर्णों को अनुमति देगा तो जांचने के लिए अधिक है।

    • लिनक्स / यूनिक्स:

      0 (NULL byte)
      
    • खिड़कियाँ:

      0-31 (ASCII control characters)
      

    नोट: जबकि यह फ़ाइल नाम में नियंत्रण वर्णों के साथ फाइल बनाने के लिए लिनक्स / यूनिक्स फाइल सिस्टम के तहत कानूनी है, यह उपयोगकर्ताओं के लिए ऐसी फ़ाइलों से निपटने के लिए एक बुरा सपना हो सकता है

  3. आरक्षित फ़ाइल नाम

    निम्नलिखित फ़ाइल नाम आरक्षित हैं:

    • खिड़कियाँ:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (दोनों अपने दम पर और मनमाने फ़ाइल एक्सटेंशन के साथ, जैसे LPT1.txt)।

  4. अन्य नियम

    • खिड़कियाँ:

      फ़ाइल नाम किसी स्थान या डॉट में समाप्त नहीं हो सकते।


5
अधिकांश विंडोज फाइलसिस्टम 8-बिट वर्णों तक ही सीमित नहीं हैं। कई अन्य 8-बिट वर्ण (NUL, नियंत्रण वर्ण) हैं जो Windows पर निषिद्ध हैं। यहां तक ​​कि उन पर विचार करना भी प्रश्नकर्ता को "फाइलसिस्टम पर एक निर्देशिका बनाने" की अनुमति नहीं देगा, क्योंकि उसने पूछा था कि गैर-निषिद्ध पात्रों से बने अमान्य निर्देशिका नामों की एक अनंत संख्या है।
डोर हाई आर्क

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

5
लिनक्स पर एक पूर्ण वर्ण भी निषिद्ध है।
दान जोन्स

3
लिनक्स पर नए लिंक पर प्रतिबंध नहीं है। मेरा तर्क है कि उन्हें होना चाहिए, हालांकि ... और अगर एनयूएल लिनक्स पर प्रतिबंध लगा दिया गया है, तो यह विंडोज पर प्रतिबंधित है, यह एक ही उद्देश्य को पूरा करता है।
Alcaro

11
@Soaku: बेशक, नहीं, क्योंकि दुनिया Microsoft के आसपास घूमती नहीं है। अनावश्यक प्रतिबंध क्यों लगाएं जब केवल दो ही वर्ण हों जो कि बिल्कुल मना करने के लिए आवश्यक हैं?
अग्निगुरिकु

68

लिनक्स और अन्य यूनिक्स से संबंधित प्रणालियों के तहत, केवल दो अक्षर हैं जो किसी फ़ाइल या निर्देशिका के नाम पर प्रकट नहीं हो सकते हैं, और वे एनयूएल '\0'और स्लैश हैं '/'। स्लैश, निश्चित रूप से, पथ नाम में दिखाई दे सकता है, निर्देशिका घटकों को अलग कर सकता है।

अफवाह 1 में यह है कि स्टीवन बॉर्न ('खोल' की प्रसिद्धि) में एक निर्देशिका थी जिसमें 254 फाइलें थीं, हर एक अक्षर (वर्ण कोड) के लिए एक फ़ाइल नाम (छोड़कर /, नाम) में दिखाई दे सकती है '\0';. वर्तमान निर्देशिका था )। इसका उपयोग बॉर्न शेल का परीक्षण करने और अनौपचारिक कार्यक्रमों जैसे बैकअप कार्यक्रमों पर नियमित रूप से कहर ढाने के लिए किया गया था।

अन्य लोगों ने विंडोज नियमों को कवर किया है।

ध्यान दें कि MacOS X में एक केस-असंवेदनशील फाइल सिस्टम है।


1 यह प्रोग्रामिंग के अभ्यास में कर्निघन और पाइक था कर्निघन जिन्होंने अध्याय 6, परीक्षण, ress6.5 तनाव परीक्षण में जितना कहा था:

जब स्टीव बॉर्न अपना यूनिक्स खोल (जिसे बॉर्न शेल के नाम से जाना जाता है) लिख रहे थे, तो उन्होंने 254 फाइलों की एक-एक कैरेक्टर के नाम के साथ एक डायरेक्टरी बनाई, जिनमें से प्रत्येक के लिए एक बाइट वैल्यू '\0'और स्लैश को छोड़कर , दो अक्षर जो यूनिक्स में दिखाई नहीं दे सकते थे फ़ाइल नाम। उन्होंने पैटर्न-मिलान और टोकन के सभी प्रकार के परीक्षणों के लिए उस निर्देशिका का उपयोग किया। (परीक्षण निर्देशिका निश्चित रूप से एक कार्यक्रम द्वारा बनाई गई थी।) बाद के वर्षों के लिए, वह निर्देशिका फ़ाइल-ट्री-वॉकिंग कार्यक्रमों का प्रतिबंध था; इसने उन्हें विनाश के लिए परखा।

ध्यान दें कि निर्देशिका में प्रविष्टियाँ होनी चाहिए .और ..इसलिए, यह 254 फाइलों के बजाय यकीनन 253 फाइलें (और 2 निर्देशिकाएं), या 255 नाम प्रविष्टियां थीं। यह उपाख्यानों की प्रभावशीलता को प्रभावित नहीं करता है, या सावधानीपूर्वक परीक्षण जो इसका वर्णन करता है।


1
254 फाइलें? और utf8 के बारे में क्या?
j_kubik

20
254 फाइलें सभी एकल-वर्ण फ़ाइल नाम थीं, एक प्रति वर्ण जिसे फ़ाइल नाम में अनुमति दी गई थी। जब स्टीव बॉर्न ने बॉर्न शेल लिखा तब UTF-8 की आंख में एक भी चमक नहीं थी। UTF-8 बाइट्स के वैध अनुक्रम के बारे में नियम लागू करता है (और बाइट्स 0xC0, 0xC1, 0xF5-0xFF को पूरी तरह से अस्वीकार करता है)। अन्यथा, यह बहुत अलग नहीं है - जिस स्तर पर मैं चर्चा कर रहा हूं।
जोनाथन लेफ़लर

1
MacOS HFS + फाइलसिस्टम के लिए ऑन-डिस्क निर्देशिका विभाजक वास्तव में '/' के बजाय ':' है। ओएस आमतौर पर (शायद हमेशा) सही काम करता है जब आप * निक्स एपीआई के साथ काम कर रहे होते हैं। लेकिन यह उम्मीद न करें कि यदि आप OSX की दुनिया में जा रहे हैं, उदाहरण के लिए, सेब के साथ। ऐसा लगता है कि शायद कोको एपीआई / का उपयोग करते हैं और इसे छिपाते हैं: आप से भी, लेकिन मुझे पूरा यकीन है कि पुराने कार्बन एपीआई नहीं हैं।
दान प्रेट्ट्स

@DanPritts मैंने Xcode की प्राथमिकताओं में एक कस्टम फ़ॉन्ट / रंग योजना बनाई, जिसका /नाम में यह नाम दिया गया। इससे कुछ समस्याएं पैदा हुईं, क्योंकि इसने स्कीम के साथ एक नई निर्देशिका बनाई।
एंड्रियास

ध्यान दें कि यदि निर्देशिका के नाम में कोई कॉलन है, तो आप निर्देशिका को एक यूनिक्स PATHचर में नहीं जोड़ सकते क्योंकि कोलोन को विभाजक (विंडोज पर अर्धविराम) के रूप में उपयोग किया जाता है। इसलिए, ऐसी निर्देशिका में प्रोग्राम या तो एक पथनाम के साथ चलाया जाना चाहिए जो यह निर्दिष्ट करता है कि वह कहां है (सापेक्ष या निरपेक्ष हो सकता है), या आपको निर्देशिका में होना चाहिए और इसमें डॉट ( ., वर्तमान निर्देशिका) होना चाहिए PATH, जिसे व्यापक रूप से माना जाता है एक असुरक्षित।
जोनाथन लेफ़लर

36

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

यह लक्ष्य फ़ाइल सिस्टम में आरक्षित नामों की समस्या को हल नहीं करता है, लेकिन एक श्वेतसूची के साथ स्रोत पर जोखिमों को कम करना आसान है।

उस भावना में, यह वर्णों की एक श्रेणी है जिसे सुरक्षित माना जा सकता है:

  • पत्र (az AZ) - यदि आवश्यक हो तो यूनिकोड वर्ण भी
  • अंक (0-9)
  • अंडरस्कोर (_)
  • हाइफ़न (-)
  • अंतरिक्ष
  • डॉट (।)

और कोई भी अतिरिक्त सुरक्षित वर्ण जिसे आप अनुमति देना चाहते हैं। इससे परे, आपको बस रिक्त स्थान और बिंदुओं के बारे में कुछ अतिरिक्त नियम लागू करने होंगे । यह आमतौर पर पर्याप्त है:

  • नाम में कम से कम एक अक्षर या संख्या होनी चाहिए (केवल डॉट्स / स्पेस से बचने के लिए)
  • नाम एक पत्र या संख्या से शुरू होना चाहिए (अग्रणी बिंदुओं / रिक्त स्थान से बचने के लिए)
  • नाम एक बिंदु या स्थान के साथ समाप्त नहीं हो सकता है (बस यदि मौजूद है तो उन्हें ट्रिम करें, जैसे एक्सप्लोरर करता है)

यह पहले से ही काफी जटिल और निरर्थक नामों की अनुमति देता है। उदाहरण के लिए, ये नाम इन नियमों के साथ संभव होंगे, और विंडोज / लिनक्स में मान्य फ़ाइल नाम होंगे:

  • A...........ext
  • B -.- .ext

संक्षेप में, यहां तक ​​कि इतने सारे श्वेत वर्णों के साथ आपको अभी भी यह तय करना चाहिए कि वास्तव में क्या मतलब है, और तदनुसार नाम को मान्य / समायोजित करें। मेरे एक आवेदन में, मैंने ऊपर के समान नियमों का उपयोग किया लेकिन किसी भी डुप्लिकेट डॉट्स और रिक्त स्थान को छीन लिया।


15
और मेरे गैर-अंग्रेजी बोलने वाले उपयोगकर्ताओं के बारे में क्या है, जो सभी को इससे परेशान करेंगे?
PKH

2
@ पख: जैसा कि मैंने अपनी पोस्ट में उल्लेख किया है, आप अपने श्वेतसूची में किसी भी आवश्यक यूनिकोड वर्ण को शामिल करेंगे। वर्णों के रंग आमतौर पर काफी आसानी से निर्दिष्ट किए जा सकते हैं, खासकर यदि आप उदाहरण के लिए नियमित अभिव्यक्ति का उपयोग करते हैं।
aeonOfTime

2
हम एक श्वेतसूची दृष्टिकोण का उपयोग करते हैं, लेकिन विंडोज पर मत भूलो कि आपको आरक्षित, केस-स्वतंत्र स्ट्रिंग्स का प्रबंधन करना है, जैसे डिवाइस नाम (prn, lpt1, con) और। और ..
ताहिर

2
आपने विंडोज प्रतिबंध को याद किया है: डॉट या स्पेस में समाप्त नहीं होना चाहिए।
मार्टिन बोनर मोनिका

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

29

आपको उत्तर बताने के लिए विंडोज प्राप्त करने का आसान तरीका एक्सप्लोरर के माध्यम से एक फ़ाइल का नाम बदलने और नए नाम के लिए / में टाइप करने का प्रयास करना है। Windows आपको एक संदेश बॉक्स पॉपअप करेगा जो आपको अवैध पात्रों की सूची बताता है।

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506


28

ठीक है, यदि केवल शोध के उद्देश्य से, तो आपका सबसे अच्छा शर्त यह है कि आप इस विकिपीडिया प्रविष्टि को फाइलनाम पर देखें

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


5

विंडोज के लिए आप इसे PowerShell का उपयोग करके जांच सकते हैं

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

UTF-8 कोड प्रदर्शित करने के लिए आप परिवर्तित कर सकते हैं

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

जो लोग PowershelI नहीं बोलते हैं, उनके लिए $ FileNameInvalidChars 0x1F के माध्यम से 0x00 है, और: "" <> | *? \ /
रॉबिन डेविस

4

विंडोज 10 (2019) में, जब आप उन्हें टाइप करने का प्रयास करते हैं, तो निम्न वर्ण त्रुटि के लिए मना किए जाते हैं:

फ़ाइल नाम में निम्न में से कोई भी वर्ण नहीं हो सकता है:

\ / : * ? " < > |


3

यहाँ क्रिस्टोफर ओजबेक के उत्तर के आधार पर खिड़कियों के लिए एसी # कार्यान्वयन है

इसमें फोल्डरफूल बूलियन द्वारा अधिक जटिल बनाया गया था, लेकिन उम्मीद है कि यह सब कुछ कवर करता है

/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// /programming/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
    StringBuilder builder = new StringBuilder(filename.Length + 12);

    int index = 0;

    // Allow colon if it's part of the drive letter
    if (containsFolder)
    {
        Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            builder.Append(match.Value);
            index = match.Length;
        }
    }

    // Character substitutions
    for (int cntr = index; cntr < filename.Length; cntr++)
    {
        char c = filename[cntr];

        switch (c)
        {
            case '\u0000':
            case '\u0001':
            case '\u0002':
            case '\u0003':
            case '\u0004':
            case '\u0005':
            case '\u0006':
            case '\u0007':
            case '\u0008':
            case '\u0009':
            case '\u000A':
            case '\u000B':
            case '\u000C':
            case '\u000D':
            case '\u000E':
            case '\u000F':
            case '\u0010':
            case '\u0011':
            case '\u0012':
            case '\u0013':
            case '\u0014':
            case '\u0015':
            case '\u0016':
            case '\u0017':
            case '\u0018':
            case '\u0019':
            case '\u001A':
            case '\u001B':
            case '\u001C':
            case '\u001D':
            case '\u001E':
            case '\u001F':

            case '<':
            case '>':
            case ':':
            case '"':
            case '/':
            case '|':
            case '?':
            case '*':
                builder.Append('_');
                break;

            case '\\':
                builder.Append(containsFolder ? c : '_');
                break;

            default:
                builder.Append(c);
                break;
        }
    }

    string built = builder.ToString();

    if (built == "")
    {
        return "_";
    }

    if (built.EndsWith(" ") || built.EndsWith("."))
    {
        built = built.Substring(0, built.Length - 1) + "_";
    }

    // These are reserved names, in either the folder or file name, but they are fine if following a dot
    // CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
    builder = new StringBuilder(built.Length + 12);
    index = 0;
    foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
    {
        Group group = match.Groups["bad"];
        if (group.Index > index)
        {
            builder.Append(built.Substring(index, match.Index - index + 1));
        }

        builder.Append(group.Value);
        builder.Append("_");        // putting an underscore after this keyword is enough to make it acceptable

        index = group.Index + group.Length;
    }

    if (index == 0)
    {
        return built;
    }

    if (index < built.Length - 1)
    {
        builder.Append(built.Substring(index));
    }

    return builder.ToString();
}

मेरे तीन प्रश्न हैं: 1. आपने StringBuilderप्रारंभिक क्षमता मूल्य के साथ आरंभ क्यों किया ? 2. आपने 12 को लंबाई में क्यों जोड़ा filename? 3. क्या 12 को मनमाने ढंग से चुना गया था या इस संख्या के पीछे कुछ सोचा गया था?
इमीनोव

2

18/04/2017 तक, इस विषय के उत्तरों के बीच पात्रों और फ़ाइलनामों की कोई सरल ब्लैक या व्हाइट सूची स्पष्ट नहीं है - और कई उत्तर हैं।

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


1
आपका उत्तर @FCastro तकनीकी दृष्टिकोण से सही है। हालांकि UX के नजरिए से यह एक बुरा सपना है - उपयोगकर्ता बार-बार "कुछ टाइप करें और मैं आपको बताऊंगा कि क्या आप सफल होते हैं" खेल को बार-बार। मैं बजाय एक संदेश (चेतावनी शैली) उपयोगकर्ता को बता रहा हूं कि उन्होंने एक अवैध चरित्र दर्ज किया है जिसे बाद में रूपांतरित किया जाएगा।
माइक

क्रिस्टोफर ओजबेक ने 2015 में इस तरह की काली सूची प्रदान की थी
जिम बाल्टर

1

हालांकि केवल अवैध यूनिक्स चार्ट हो सकता है /और NULL, हालांकि कमांड लाइन व्याख्या के लिए कुछ विचार शामिल किए जाने चाहिए।

उदाहरण के लिए, यह एक फ़ाइल नाम के लिए कानूनी हो सकता है, जबकि 1>&2या2>&1 यूनिक्स में , जैसे कि कमांड लाइन पर उपयोग किए जाने पर फ़ाइल नाम की गलत व्याख्या की जा सकती है।

इसी तरह किसी फ़ाइल का नाम देना संभव हो सकता है $PATH , लेकिन जब इसे कमांड लाइन से एक्सेस करने की कोशिश की जाती है, तो शेल $PATHइसके वैरिएबल वैल्यू में ट्रांसलेट हो जाएगा ।


मार में शाब्दिक के लिए, सबसे अच्छा तरीका है मैं शाब्दिक घोषित करने के लिए बिना प्रक्षेप है मिल गया है $'myvalueis': पूर्व $ echo 'hi' > $'2>&1', cat 2\>\&1"हाय"
ThorSummoner

1

परिभाषित करने में कठिनाइयाँ, क्या कानूनी है और पहले से ही एड्रेस्ड नहीं थे और श्वेतसूची का सुझाव दिया गया था । लेकिन विंडोज अधिक-से-8-बिट वर्णों का समर्थन करता हैविकिपीडिया राज्यों , कि (उदाहरण के लिए)

संशोधक पत्र बृहदान्त्र ( नीचे 7. देखें ) यह कभी-कभी विंडोज़ फ़ाइलनामों में उपयोग किया जाता है क्योंकि यह फ़ाइल नाम के लिए इस्तेमाल किए गए सेगो यूआई फ़ॉन्ट में बृहदान्त्र के समान है । [विरासत में मिला ASCII] बृहदान्त्र ही अनुमति नहीं है।

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

  1. इसके बजाय *( U+002A * ASTERISK), आप कई सूचीबद्ध में से एक का उपयोग कर सकते हैं , उदाहरण के लिए U+2217 ∗ (ASTERISK OPERATOR)याFull Width Asterisk U+FF0A *
  2. इसके बजाय ., आप इनमें से किसी एक का उपयोग कर सकते हैं , उदाहरण के लिए⋅ U+22C5 dot operator
  3. इसके बजाय ", आप उपयोग कर सकते हैं “ U+201C english leftdoublequotemark(विकल्प यहां देखें )
  4. इसके बजाय /( / SOLIDUS U+002F), आप यहां∕ DIVISION SLASH U+2215 (अन्य लोगों का उपयोग कर सकते हैं) ) का
  5. \( \ U+005C Reverse solidus) के बजाय , आप ⧵ U+29F5 Reverse solidus operator( अधिक ) का उपयोग कर सकते हैं
  6. इसके बजाय [( U+005B Left square bracket) और ]( U+005D Right square bracket), उदाहरण के लिए उपयोग कर सकते हैं U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETऔर U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(से यहाँ , अधिक संभावनाएं यहाँ )
  7. इसके बजाय :, आप उपयोग कर सकते हैं U+2236 ∶ RATIO (for mathematical usage)या U+A789 ꞉ MODIFIER LETTER COLON, ( बृहदान्त्र (पत्र देखें ) , कभी-कभी विंडोज फ़ाइलनाम में उपयोग किया जाता है क्योंकि यह फ़ाइल नाम के लिए इस्तेमाल किए गए सेगो यूआई फ़ॉन्ट में बृहदान्त्र के समान है । बृहदान्त्र स्वयं की अनुमति नहीं है) ( यहां देखें )
  8. इसके बजाय ;, आप उपयोग कर सकते हैं U+037E ; GREEK QUESTION MARK( यहां देखें )
  9. के लिए |:, इस तरह के रूप में कुछ अच्छे विकल्प हैं U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESया U+01C0 ǀ LATIN LETTER DENTAL CLICK( विकिपीडिया )। साथ ही बॉक्स ड्रॉइंग कैरेक्टर में कई अन्य विकल्प हैं।
  10. इसके बजाय ,( , U+002C COMMA), आप उदाहरण के लिए उपयोग कर सकते हैं ‚ U+201A SINGLE LOW-9 QUOTATION MARK( यहां देखें )
  11. के लिए ?( U+003F ? QUESTION MARK), ये अच्छे उम्मीदवार हैं: U+FF1F ? FULLWIDTH QUESTION MARKया U+FE56 ﹖ SMALL QUESTION MARK( वह फिर से , डिंगबैट्स ब्लॉक से दो और , "प्रश्न" की खोज करें)

0

विंडोज में इंटरनेट शॉर्टकट बनाते समय, फ़ाइल का नाम बनाने के लिए, यह अवैध पात्रों को छोड़ देता है, आगे के स्लैश को छोड़कर, जिसे माइनस में बदल दिया जाता है।


3
"उत्तर नहीं ... अस्वीकृत - एक मॉडरेटर ने आपके ध्वज की समीक्षा की, लेकिन इसका समर्थन करने के लिए कोई सबूत नहीं मिला"। आप मुझसे मज़ाक कर रहे हो। बेहतर मध्यस्थ, कृपया।
जिम बाल्टर

-1

यूनिक्स के गोले में, आप लगभग हर चरित्र को एकल उद्धरण में उद्धृत कर सकते हैं '। एकल उद्धरण को छोड़कर, और आप नियंत्रण वर्णों को व्यक्त नहीं कर सकते, क्योंकि \इसका विस्तार नहीं है। एक उद्धृत स्ट्रिंग के भीतर से एकल उद्धरण को एक्सेस करना संभव है, क्योंकि आप सिंगल और डबल कोट्स के साथ स्ट्रिंग को सम्‍मिलित कर सकते हैं, जैसे 'I'"'"'m'कि फ़ाइल नामक एक्सेस करने के लिए उपयोग किया जा सकता है"I'm" (डबल उद्धरण यहां भी संभव है)।

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

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


सवाल गोले के बारे में नहीं है।
जिम बाल्टर

-8

मेरी वही आवश्यकता थी और सिफारिश या मानक संदर्भों की तलाश थी और इस धागे के पार आया। मेरे वर्णों की वर्तमान ब्लैकलिस्ट जिसे फ़ाइल और निर्देशिका नामों से बचना चाहिए:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};

4
क्या आप @सूची में होने पर टिप्पणी करना चाहेंगे ?
PypeBros

8
सवाल था कि कौन से पात्र अवैध हैं। आपकी सूची में अधिकांश वर्ण कानूनी हैं।
निगेल एल्डर्टन

6
पत्र b? योग्य, मुझे लगता है कि यह है कि बी से lank spaces... अच्छी तरह से अभी भी कुछ छोड़ देता है ... मैंने एक तस्वीर का नाम बदल दिया, (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpgलेकिन इसे वापस बदलना पड़ा क्योंकि यह गुस्सा दिख रहा था ...
ashleedawg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.