2009-06-18 22 views
11

प्रश्न के लिए प्रस्तुत करने का विषय देखें।वैध फ़ाइल नाम चेक। सबसे अच्छा तरीका क्या है?

1) मैं VB.NET में एक बहुत अच्छा विकल्प LINQ का उपयोग कर देख याद "% की तरह '

2) मैं जानता हूँ कि नियमित अभिव्यक्ति काम करेंगे और मुझे लगता है कि कम से कम कोड और शायद का परिणाम देगा का उपयोग कर मैच के लिए नहीं इस तरह के एक साधारण परीक्षण के लिए पढ़ने के लिए भी मुश्किल हो जाएगा

यहाँ मैं क्या किया है चेतावनी:।।। सच कहूं आप वाला यह नफरत कर रहे हैं

Private Shared Function FileNameIsOk(ByVal fileName As String) As Boolean 

    For Position As Integer = 0 To fileName.Length - 1 

     Dim Character As String = fileName.Substring(Position, 1).ToUpper 
     Dim AsciiCharacter As Integer = Asc(Character) 

     Select Case True 

      Case Character = "_" 'allow _ 
      Case Character = "." 'allow . 
      Case AsciiCharacter >= Asc("A") And AsciiCharacter <= Asc("A") 'Allow alphas 
      Case AsciiCharacter >= Asc("0") AndAlso AsciiCharacter <= Asc("9") 'allow digits 

      Case Else 'otherwise, invalid character 
       Return False 

     End Select 

    Next 

    Return True 

End Function 

उत्तर

12

पुराना अब, लेकिन मैंने इसे देखा और बस एक नया जवाब जोड़ना पड़ा। वर्तमान स्वीकृत और अन्य उत्तरों आवश्यकतानुसार बस अधिक जटिल हैं। वास्तव में, यह एक ही पंक्ति को कम किया जा सकता है:

Public Shared Function FilenameIsOK(ByVal fileName as String) as Boolean 
    Return Not (Path.GetFileName(fileName).Intersect(Path.GetInvalidFileNameChars()).Any() OrElse Path.GetDirectoryName(fileName).Intersect(Path.GetInvalidPathChars()).Any()) 
End Function 

हालांकि मैं इसे लिखने की सलाह देते हैं कि जिस तरह से नहीं होता। इसे तोड़ने के लिए सिर्फ एक छोटा सा सुधार करने के लिए पठनीयता:

Public Shared Function FilenameIsOK(ByVal fileName as String) as Boolean 
    Dim file As String = Path.GetFileName(fileName) 
    Dim directory As String = Path.GetDirectoryName(fileName) 

    Return Not (file.Intersect(Path.GetInvalidFileNameChars()).Any() _ 
       OrElse _ 
       directory.Intersect(Path.GetInvalidPathChars()).Any()) 
End Function 

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

+0

कभी भी सुधार करने में देर नहीं हुई। धन्यवाद। – ChadD

+2

यदि मैं कर सकता हूं, तो इस फ़ंक्शन का उद्देश्य फ़ाइल नाम में मान्य वर्णों का परीक्षण करना है। लेकिन अगर इसमें अमान्य वर्ण हैं, तो यह पहली पंक्ति पर दुर्घटनाग्रस्त हो जाएगा: पथ। गेटफ़ाइलनाम (फ़ाइल नाम) – David

+0

* "इस विधि से लौटाई गई सरणी को उन वर्णों का पूरा सेट शामिल करने की गारंटी नहीं है जो फ़ाइल और निर्देशिका नामों में अमान्य हैं। अमान्य वर्णों का पूरा सेट फ़ाइल सिस्टम द्वारा भिन्न हो सकता है। उदाहरण के लिए, विंडोज-आधारित डेस्कटॉप प्लेटफ़ॉर्म पर, अमान्य पथ वर्णों में ASCII/यूनिकोड वर्ण 1 से 31, साथ ही उद्धरण ("), (<) से कम, <<) से अधिक हो सकता है (>), पाइप (|), बैकस्पेस (\ b), शून्य (\ 0) और टैब (\ t)। "* https://msdn.microsoft.com/en-us/library/system.io.path .getinvalidfilenamechars (v = vs.110) .aspx – mbomb007

0

, मैं सिर्फ FileInfo वस्तु बनाया का उपयोग करेंगे .NET में, और अमान्यता के लिए अपवाद की जांच करें।देखें विवरण के लिए 10 संदर्भ।

+0

कोड एक रास्ता है कि यह हालांकि करने के लिए पहुँच नहीं है मान्य करने के लिए प्रयास कर रहे हों। – patjbs

+0

बिल्कुल। मेरे मामले में। – ChadD

+3

नियंत्रण प्रवाह को संभालने के लिए अपवादों का उपयोग करना बुरा अभ्यास है! –

2

यह है एक regex और सी #, लेकिन:

using System; 
using System.Text.RegularExpressions; 

/// <summary> 
/// Gets whether the specified path is a valid absolute file path. 
/// </summary> 
/// <param name="path">Any path. OK if null or empty.</param> 
static public bool IsValidPath(string path) 
{ 
    Regex r = new Regex(@"^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$"); 
    return r.IsMatch(path); 
} 
+0

क्या यह ओएस स्वतंत्र है? अगर मैं मोनो के तहत कभी भी दौड़ता हूं तो मैं सतर्क रहूंगा। –

+1

+1 दो लाइन समाधान के लिए +1, -1 अंग्रेजी संगत होने के लिए केवल ... :) –

10

कैसे के बारे में Path.GetInvalidFileNameChars और Path.GetInvalidPathChars?

Public Shared Function FilenameIsOK(ByVal fileNameAndPath as String) as Boolean 
    Dim fileName = Path.GetFileName(fileNameAndPath) 
    Dim directory = Path.GetDirectoryName(fileNameAndPath) 
    For each c in Path.GetInvalidFileNameChars() 
     If fileName.Contains(c) Then 
      Return False 
     End If 
    Next 
    For each c in Path.GetInvalidPathChars() 
     If directory.Contains(c) Then 
      Return False 
     End If 
    Next 
    Return True 
End Function 
+0

एक आश्चर्यजनक जवाब! बहुत बढ़िया! – ChadD

+0

यह संभवतः कैसे काम कर सकता है? क्योंकि अगर फ़ाइल नाम में पहले से ही अमान्य वर्ण हैं, तो फ़ाइल नाम (लाइन 1) प्राप्त करने का प्रयास अपवाद पर जा रहा है, क्योंकि GetFilename CheckInvalidPathChars को कॉल करता है और इसलिए अपवाद फेंकता है –

+1

मुझे पता है कि यह एक पुराना प्रश्न है लेकिन ऊपर पॉल फ़री द्वारा टिप्पणी मुझे दिए गए समाधान पर संदेह है, इसलिए अगर किसी और के पास एक ही संदेह है तो मैं इसे सही करना चाहता हूं। यदि आप CheckInvalidPathChars की परिभाषा को देखते हैं तो यह वास्तव में केवल 5 संभावित अमान्य वर्णों को देखता है जबकि GetInvalidFileNameChars() अमान्य वर्णों की एक लंबी सूची सूचीबद्ध करता है। इसलिए ऊपर की विधि निश्चित रूप से Path.GetFilename पर निर्भर करते हुए सभी मुद्दों को पकड़ने जा रही है चेकइवलिडपैथ चार्ज नहीं है। –

1

हालांकि इस काफी पुराना है, यह अभी भी मान्य है, और मैं कैसे अमान्य वर्ण के लिए फ़ाइल नाम की जाँच करने का हल की तलाश में यहां समाप्त हो गया। मैंने स्वीकृत उत्तर को देखा और कुछ छेद पाए।

उम्मीद है कि ये संशोधन किसी और के लिए कुछ उपयोग हैं।

Public Function FilenameIsOK(ByVal fileNameAndPath As String) As Boolean 
    Dim fileName As String = String.Empty 
    Dim theDirectory As String = fileNameAndPath 

    Dim p As Char = Path.DirectorySeparatorChar 

    Dim splitPath() As String 
    splitPath = fileNameAndPath.Split(p) 
    If splitPath.Length > 1 Then 
     fileName = splitPath(splitPath.Length - 1) 
     theDirectory = String.Join(p, splitPath, 0, splitPath.Length - 1) 
    End If 

    For Each c As Char In Path.GetInvalidFileNameChars() 
     If fileName.Contains(c) Then 
      Return False 
     End If 
    Next 

    For Each c As Char In Path.GetInvalidPathChars() 
     If theDirectory.Contains(c) Then 
      Return False 
     End If 
    Next 
    Return True 
End Function 
1

इस

Public Function IsValidFileName(ByVal fn As String) As Boolean 
    Try 
     Dim fi As New IO.FileInfo(fn) 
    Catch ex As Exception 
     Return False 
    End Try 
    Return True 
End Function 
+1

आपको अपने आवेदन के सामान्य संचालन के हिस्से के रूप में अपवादों का उपयोग करने की योजना नहीं बनाना चाहिए - जब एक अवैध फ़ाइल नाम पारित किया जाता है, तो यह सीएलआर को एक पूर्ण स्टैक ट्रेस (अन्य चीजों के साथ) उत्पन्न करने का कारण बनता है [जो महंगा है] (http: // stackoverflow.com/a/4648011/156755)। – Basic

+0

खराब अभ्यास या कम्प्यूटेशनल व्यय माइक्रोसॉफ्ट को कभी नहीं रोका! – gls123

+0

जबकि मैं इस फ़ंक्शन को इस तरह से नहीं लिखूंगा, मैं कहूंगा कि आखिरकार समस्या को संभालने का यह सबसे अच्छा तरीका है: बस पहले से ही फाइल बनाएं, और अगर आपको कोई समस्या है तो अपवाद को संभालें ... सबसे पहले, आप फ़ाइल सिस्टम की अस्थिर प्रकृति की वजह से अपवाद हैंडलर को वैसे भी लिखना है। –

0

ठीक है की कोशिश करो। अच्छे विचार। लेकिन जब आप हजारों फाइलों के साथ काम करते हैं तो 'अमान्य' वर्णों का मैन्युअल पुनरावृत्ति सबसे अच्छा तरीका नहीं है।

Public BadChars() As Char = IO.Path.GetInvalidFileNameChars 

For m = 0 To thousands_of_files - 1 
    '.. 
    if currFile.Name.ToCharArray.Intersect(BadChars).Count > 1 Then 
     ' the Name is invalid - what u gonna do? =) 
    end if 
    '.. 
    '.. 
Next 
0

, इस

समारोह IsValidFileNameOrPath (ByVal नाम स्ट्रिंग के रूप में) बूलियन

मंद मैं के रूप में पूर्णांक मंद dn के रूप में, स्ट्रिंग

i = InStrRev(name, "\") : dn = Mid(name, 1, i) : fn = Mid(name, i + 1) 
    MsgBox("directory = " & dn & " : file = " & fn) 

    If name Is Nothing Or Trim(fn) = "" Then 
     MsgBox("null filename" & fn) 
     Return False 
    Else 
     For Each badchar As Char In Path.GetInvalidFileNameChars 
      If InStr(fn, badchar) > 0 Then 
       MsgBox("invalid filename" & fn) 
       Return False 
      End If 
     Next 
    End If 

    If dn <> "" Then 
     If InStr(dn, "\\") > 0 Then 
      MsgBox("duplicate \ = " & dn) 
      Return False 
     End If 
     For Each badChar As Char In Path.GetInvalidPathChars 
      If InStr(dn, badChar) > 0 Then 
       MsgBox("invalid directory= " & dn) 
       Return False 
      End If 
     Next 
     If Not System.IO.Directory.Exists(dn) Then 
      Try 
       Directory.CreateDirectory(dn) 
       'Directory.Delete(dn) 
      Catch 
       MsgBox("invalid path = " & dn) 
       Return False 
      End Try 
     End If 
    End If 
    Return True 
End Function 
1

के रूप में fn योएल Coehoorns अच्छी तरह से लिखा समाधान के आधार पर की कोशिश करो मैंने सत्यापन के लिए कुछ अतिरिक्त कार्यक्षमता जोड़ा।

''' <summary> 
    ''' Check if fileName is OK 
    ''' </summary> 
    ''' <param name="fileName">FileName</param> 
    ''' <param name="allowPathDefinition">(optional) set true to allow path definitions. If set to false only filenames are allowed</param> 
    ''' <param name="firstCharIndex">(optional) return the index of first invalid character</param> 
    ''' <returns>true if filename is valid</returns> 
    ''' <remarks> 
    ''' based on Joel Coehoorn answer in 
    ''' http://stackoverflow.com/questions/1014242/valid-filename-check-what-is-the-best-way 
    ''' </remarks> 
    Public Shared Function FilenameIsOK(ByVal fileName As String, _ 
             Optional ByVal allowPathDefinition As Boolean = False, _ 
             Optional ByRef firstCharIndex As Integer = Nothing) As Boolean 

     Dim file As String = String.Empty 
     Dim directory As String = String.Empty 

     If allowPathDefinition Then 
      file = Path.GetFileName(fileName) 
      directory = Path.GetDirectoryName(fileName) 
     Else 
      file = fileName 
     End If 

     If Not IsNothing(firstCharIndex) Then 
      Dim f As IEnumerable(Of Char) 
      f = file.Intersect(Path.GetInvalidFileNameChars()) 
      If f.Any Then 
       firstCharIndex = Len(directory) + file.IndexOf(f.First) 
       Return False 
      End If 

      f = directory.Intersect(Path.GetInvalidPathChars()) 
      If f.Any Then 
       firstCharIndex = directory.IndexOf(f.First) 
       Return False 
      Else 
       Return True 
      End If 
     Else 
      Return Not (file.Intersect(Path.GetInvalidFileNameChars()).Any() _ 
         OrElse _ 
         directory.Intersect(Path.GetInvalidPathChars()).Any()) 
     End If 

    End Function 
0

मैं इस (अच्छी तरह से दो) लाइनर के लिए क्रेडिट नहीं ले सकता। मुझे यह पता चला कि गुगलिंग-याद नहीं है कि मुझे यह कहां मिला।

Dim newFileName As String = "*Not<A>Good:Name|For/\File?" 
    newFileName = String.Join("-", fileName.Split(IO.Path.GetInvalidFileNameChars)) 
0
Public Function IsValidFileName(nFile As String) As Boolean 
    Try 
     Dim S As String = Path.GetFileName(nFile) 
    Catch 
     Return False 
    End Try 
    Return True 
End Function 
+3

अधिक वर्णनात्मक रहें कोई जवाब पोस्ट करना – Satendra

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