有效文件名检查.什么是最好的方法?

Cha*_*adD 11 vb.net

请参阅提出问题的主题.

1)我记得在VB.NET中看到一个非常酷的选项,使用LINQ匹配使用"LIKE%"

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
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 14

现在老了,但我看到了这个,只需添加一个新的答案.当前接受和其他答案比需要的更复杂.实际上,它可以简化为一行:

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
Run Code Online (Sandbox Code Playgroud)

虽然我不建议这样写.稍微分解一下以提高可读性:

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
Run Code Online (Sandbox Code Playgroud)

另一点是,处理文件系统问题的最佳方法通常是让文件系统告诉您:只是尝试打开或创建有问题的文件,并处理异常.这种方法效果特别好,因为无论如何你都可能必须这样做.你在这里做的任何事情都是重复的工作,你仍然需要把它放到一个异常处理程序中.

  • 如果可能的话,这个函数的目的是测试文件名中的有效字符.但如果它包含无效字符,它将在第一行崩溃:Path.GetFileName(fileName) (2认同)

Bob*_*ing 10

如何Path.GetInvalidFileNameCharsPath.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
Run Code Online (Sandbox Code Playgroud)