见问题的定位主题。
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
最佳答案
现在旧了,但我看到了这个,只好添加一个新答案。当前接受的答案和其他答案比需要的要复杂得多。事实上,它可以简化为一行:
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
这里的另一点,通常是处理文件系统问题的最佳方法是让文件系统告诉您:尝试打开或创建有问题的文件,并处理异常。这特别有效,因为无论如何您都可能不得不这样做。您在此处执行的任何其他验证都是重复的工作,您仍然必须将其放入异常处理程序中。
关于vb.net - 有效的文件名检查。最好的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1014242/