यह जांचने का सबसे आसान तरीका है कि यदि कोई मनमाना स्ट्रिंग एक वैध फ़ाइल नाम है


79

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

ऐसा करने का सबसे आसान तरीका क्या है?

मान्य द्वारा मैं कानूनी और गैर-मौजूदा के लिए पुन: लाभ उठा रहा हूं


जब आप मान्य फ़ाइल नाम कहते हैं, तो क्या आप इस तथ्य का उल्लेख कर रहे हैं कि फ़ाइल मौजूद है, या आप पूछ रहे हैं कि क्या नाम को ऑपरेशन सिस्टम द्वारा अनुमति दी जाएगी?
जेसी मैककुलोच

4
मान्य के रूप में (ए) मौजूदा, (बी) कानूनी, या (सी) कानूनी और गैर-मौजूदा?
एंथनी पेग्राम

Sry i को स्पष्ट करना चाहिए था कि। यह होना चाहिए (ग) रिसाव और गैर मौजूदा
RoflcoptrException

4
@roflcopter: फ़ाइल बनाते समय आपको बस त्रुटियों को संभालना होगा। कोई भी फाइलसिस्टम ऑपरेशन जिसमें एक अस्तित्व की जांच शामिल है, वह पहले से ही संभावित रूप से उस तारीख तक आउट-ऑफ-डेट है, क्योंकि फाइलसिस्टम एक वैश्विक साझा संसाधन है।
बेन वोइगट

1
@Roflcoptr: आपके द्वारा वैधता और / या अस्तित्व की जाँच करने वाले क्षण के बीच बनाए जाने वाले सटीक नाम के साथ एक फ़ाइल, और वह क्षण जब आप वास्तव में इसे बनाने का प्रयास करते हैं, इसे सामान्य प्रोग्राम प्रवाह नहीं माना जाता है। आपको यह सत्यापित करना चाहिए कि फ़ाइल मौजूद नहीं है, लेकिन जब आप वास्तव में फ़ाइल बनाते हैं, तो वह ज्ञान पहले से ही पुराना है और इसे केवल एक शिक्षित अनुमान माना जाना चाहिए। यह अभी भी सच होने की संभावना है, लेकिन इसकी गारंटी नहीं है ।
फ्रेड्रिक मोर

जवाबों:


125

जाँच करें कि क्या filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0और!File.Exists(Path.Combine(someFolder, filename))


3
<उद्धरण> इस पद्धति से लौटाए गए सरणी में उन वर्णों का पूरा सेट शामिल करने की गारंटी नहीं है जो फ़ाइल और निर्देशिका नामों में अमान्य हैं। </ उद्धरण> इसके अलावा, वह संपत्ति पदावनत है।
बेन वोइगट

4
प्रति-उदाहरण: "http://www.microsoft.com/"अपना परीक्षण पास करता है, लेकिन मान्य फ़ाइल नाम नहीं है, के लिए ditto"::::"
बेन Voigt

3
अधिक प्रति-उदाहरण: "" मान्य नहीं है और नया स्ट्रिंग ('x', 1024) भी मान्य नहीं है।
रासमस फेबर

2
@ shellster आप फ़ाइल एक्सप्लोरर का नाम बदलकर ".txt" करने के लिए फ़ाइल एक्सप्लोरर का नाम बताकर विंडोज़ एक्सप्लोरर में एक फ़ाइल का नाम बदल सकते हैं। बस एक टिप (या ".txt ........" भी काम करेगा)।
रॉबर्ट मैककी

2
< 0इसके बजाय होना चाहिए -1 के >= 0रूप IndexOfAny()में -1 वापस आ जाएगा अगर कोई नहीं पाया जाता है
माइकल ट्रेंचिडा

37

के खिलाफ जाँच करें GetInvalidFileNameChars():

var isValid = !string.IsNullOrEmpty(fileName) &&
              fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
              !File.Exists(Path.Combine(sourceFolder, fileName));

2
प्रति-उदाहरण: "http://www.microsoft.com/"अपना परीक्षा पास करता है, लेकिन मान्य फ़ाइल नाम नहीं है, के लिए "::::"
डिट्टो

1
@ बॉन वायगट: आप सही हैं जिसे ::::गलत तरीके से वैध माना गया था। मैंने < 0इसके बजाय इंगित करने के लिए उत्तर को सही कर दिया है == 0
फिल हंट

1
ओह, मैं तो बस आप उपयोग कर रहे देखा GetInvalidFileNameChars, नहीं GetInvalidPathCharsSLaks की तरह। जब तक यह केवल फ़ाइल नाम के लिए एक परीक्षण है और एक फ़ाइल नाम के साथ नहीं है, तब तक यह ठीक रहेगा।
बेन वोइगट

@Ben Voigt: चूंकि ओपी ने फ़ाइल नामों को मान्य करने के बारे में पूछा था, और केवल गैर-अस्तित्व फ़ाइल को मान्य करने के लिए पथ, मैंने इस्तेमाल किया GetInvalidFileNameChars:-)
फिल हंट

11

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

यह बताने का एकमात्र विश्वसनीय तरीका है कि फ़ाइल नाम स्वीकार्य है या नहीं। अनुमतियाँ एक नैतिकता है।


फ़ाइल संवाद एक लाल हेरिंग है, लेकिन "केवल सही मायने में विश्वसनीय तरीका ... इसे आज़माने के लिए" +1 है।
बेन वोइगट

1
माना। यहां तक ​​कि अगर फ़ाइल नाम मौजूद नहीं है और कोई भी अवैध वर्ण नहीं है, तो कई कारण हैं कि फ़ाइल क्यों नहीं बनाई जाएगी, सबसे स्पष्ट है कि निर्देशिका बनाने की अनुमति का अभाव है।
बॉब कॉफ़मैन

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

2

मैं इसका उपयोग करता हूं:

public static bool IsValidFileName(string name) {
    if(string.IsNullOrWhiteSpace(name)) return false;
    if(name.Length > 1 && name[1] == ':') {
        if(name.Length < 4 || name.ToLower()[0] < 'a' || name.ToLower()[0] > 'z' || name[2] != '\\') return false;
        name = name.Substring(3);
    }
    if(name.StartsWith("\\\\")) name = name.Substring(1);
    if(name.EndsWith("\\") || !name.Trim().Equals(name) || name.Contains("\\\\") ||
        name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray()) >= 0) return false;
    return true;
}

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


0

यह सिर्फ एक विचार है। एक अपवाद सूची को आबाद करना चाहिए:

public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}

यदि फ़ाइल अभी तक मौजूद नहीं है तो क्या होगा?
माइक चेनल

@MikeCheel एक तर्क अपवाद को फेंक दिए जाने पर कोड केवल गलत है। यह अपवाद केवल फेंका गया है फ़ाइल नाम अमान्य है।
बुरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.