ऑपरेटिंग सिस्टम के आधार पर, मुझे फ़ाइल नाम में अनुमत वर्णों की सूची कहां मिल सकती है? (लिनक्स पर उदाहरण के लिए, वर्ण :
फ़ाइल नाम में अनुमत है, लेकिन विंडोज पर नहीं)
ऑपरेटिंग सिस्टम के आधार पर, मुझे फ़ाइल नाम में अनुमत वर्णों की सूची कहां मिल सकती है? (लिनक्स पर उदाहरण के लिए, वर्ण :
फ़ाइल नाम में अनुमत है, लेकिन विंडोज पर नहीं)
जवाबों:
आपको विकिपीडिया फ़ाइल नाम पेज से शुरू करना चाहिए । इसमें एक सभ्य आकार की तालिका है ( फ़ाइल नाम सीमाओं की तुलना ), बहुत सारे फ़ाइल सिस्टम के लिए आरक्षित वर्णों की सूची।
इसमें प्रत्येक फ़ाइल सिस्टम के बारे में अन्य जानकारी का ढेर भी है , जिसमें आरक्षित फ़ाइल नाम जैसे CON
MS-DOS शामिल हैं। मैंने उल्लेख किया है कि केवल इसलिए कि मुझे एक बार काट लिया गया था जब मैंने एक सम्मिलित फ़ाइल को छोटा कर दिया const.h
था con.h
और आधे घंटे लगा रहा था कि संकलक ने क्यों लटका दिया।
DOS ने उपकरणों के लिए एक्सटेंशन को अनदेखा कर दिया, जो कि con.h
बिल्कुल उसी तरह था con
, जैसे इनपुट कंसोल (मतलब, निश्चित रूप से, कंपाइलर मेरे हेडर फाइल में टाइप करने से पहले इंतजार कर रहा था कि यह जारी रहेगा)।
POSIX "Fully portable filenames"
प्रविष्टि को देखना है , जो इनकी सूची बनाती है:A–Z a–z 0–9 . _ -
ठीक है, इसलिए यदि आप केवल मुख्य खिलाड़ियों के फाइल सिस्टम की परवाह करते हैं , तो फाइल सिस्टम की तुलना देखें :
NUL
, \
, /
, :
, *
, "
, <
, >
, |
। इसके अलावा, प्रारंभ या अंत में कोई स्थान वर्ण नहीं है, और अंत में कोई अवधि नहीं है ।:
या/
NUL
या/
इसलिए किसी भी बाइट को छोड़कर NUL
, \
, /
, :
, *
, "
, <
, >
, |
/ फ़ोल्डर कॉल करेगा और आपको फ़ाइलें नहीं हो सकता है .
या ..
और (बेशक) कोई नियंत्रण नहीं वर्ण।
/
। विंडोज बैकस्लैश और कुछ स्ट्रिंग्स (जैसे CON
) की अनुमति नहीं देता है ।
:
उनके नाम के साथ फाइल बनाने में सक्षम हूं ।
/
खोजक में Mac OS X (जिसे अब MacOS कहा जाता है) के बारे में अधिक सटीक होना :
यूनिक्स फाइल सिस्टम में व्याख्या किया गया है।
यह बैकवर्ड कम्पैटिबिलिटी के लिए किया गया था जब एप्पल क्लासिक मैक ओएस से चला गया था।
/
फाइंडर में एक फ़ाइल नाम में एक का उपयोग करना वैध है , टर्मिनल में उसी फ़ाइल को देखकर यह एक के साथ दिखाई देगा :
।
और यह दूसरे तरीके से भी काम करता है: आप /
टर्मिनल के साथ फ़ाइल नाम में एक का उपयोग नहीं कर सकते हैं , लेकिन :
यह ठीक है और /
फाइंडर में एक के रूप में दिखाई देगा ।
कुछ एप्लिकेशन अधिक प्रतिबंधात्मक हो सकते हैं और भ्रम से बचने के लिए दोनों वर्णों को प्रतिबंधित कर सकते हैं या क्योंकि वे पिछले क्लासिक मैक ओएस से या प्लेटफार्मों के बीच नाम संगतता के लिए तर्क रखते थे।
"अंग्रेजी लोकेल" फ़ाइल नामों के लिए, यह अच्छी तरह से काम करता है। मैं अपलोड किए गए फ़ाइल नामों को सैनिटाइज़ करने के लिए इसका उपयोग कर रहा हूं। फ़ाइल नाम डिस्क पर किसी भी चीज़ से जुड़ा होने के लिए नहीं है, यह तब है जब फ़ाइल डाउनलोड की जा रही है इसलिए कोई पथ जाँच नहीं है।
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
मूल रूप से यह विंडोज और अन्य ओएस के लिए सभी गैर-मुद्रण योग्य और आरक्षित वर्णों को स्ट्रिप्स करता है। आप अन्य स्थानों और कार्यात्मकताओं का समर्थन करने के लिए आसानी से पैटर्न का विस्तार कर सकते हैं ।
यहाँ अजगर में फ़ाइल नाम को साफ़ करने का कोड है।
import unicodedata
def clean_name(name, replace_space_with=None):
"""
Remove invalid file name chars from the specified name
:param name: the file name
:param replace_space_with: if not none replace space with this string
:return: a valid name for Win/Mac/Linux
"""
# ref: https://en.wikipedia.org/wiki/Filename
# ref: /programming/4814040/allowed-characters-in-filename
# No control chars, no: /, \, ?, %, *, :, |, ", <, >
# remove control chars
name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
if replace_space_with is not None:
return cleaned_name.replace(' ', replace_space_with)
return cleaned_name
:return: a valid name for Win/Mac/Linux
सभी परिस्थितियों में सच नहीं है।