我有以下函数循环遍历目录并检查指定的文件夹和文件:
Private Function VerifyPath(ByVal root As String, ByVal folder As String, _
ByVal file As String) As Boolean
Dim folders As New List(Of String), files As New List(Of String)
Dim oDir As New IO.DirectoryInfo(root)
For Each dir As IO.DirectoryInfo In oDir.GetDirectories
folders.Add(dir.Name.ToLower)
Next
If folders.Contains(folder) Then
For Each item As IO.FileInfo In oDir.GetFiles
files.Add(item.Name.ToLower)
Next
If files.Contains(file) Then
Return True
End If
End If
Return False
End Function
我做这个方法的原因是我可以确保每个列表中的项目和传递的文件/文件夹都是小写的,否则我会做这样的事情:
If oDir.GetDirectories.Contains( _
New IO.DirectoryInfo(String.Format("{0}\{1}", root, folder))) Then
If oDir.GetFiles.Contains( _
New IO.FileInfo(String.Format("{0}\{1}", root, file))) Then
Return True
End If
End If
Return False
我的同事之前向我提到了一些关于能够通过使用比较器来忽略案例的事情。 .Contains
扩展名可以包含比较器参数和值。我在谷歌和MSDN上做了一些搜索,并提出了以下比较器:
Public Class dirCompare
Implements IEqualityComparer(Of IO.DirectoryInfo)
Dim theCompare As CaseInsensitiveComparer
Sub New()
theCompare = CaseInsensitiveComparer.DefaultInvariant
End Sub
Sub New(ByVal culture As CultureInfo)
theCompare = New CaseInsensitiveComparer(culture)
End Sub
Public Function Equals1(ByVal x As System.IO.DirectoryInfo, ByVal y As System.IO.DirectoryInfo) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of System.IO.DirectoryInfo).Equals
If theCompare.Compare(x.name, y.name) = 0 Then
Return True
Else
Return False
End If
End Function
Public Function GetHashCode1(ByVal obj As System.IO.DirectoryInfo) As Integer Implements System.Collections.Generic.IEqualityComparer(Of System.IO.DirectoryInfo).GetHashCode
Return obj.ToString.ToLower.GetHashCode
End Function
End Class
当它到达theCompare(x.name, y.name) = 0
行时,它会出错并且这是错误消息:
At least one object must implement IComparable.
任何人都知道这个错误意味着什么,以及如何纠正它?
答案 0 :(得分:2)
那么你可以实现一个比较器,但在这种情况下这将是一个艰难的方法。您可以选择其他几种选择。
首先,您可以使用不区分大小写的比较器。实际上有几个。查看System.StringComparer
下的智能感知提示。
第二个是字符串已经有一种内置方式来指定不区分大小写的比较:
Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
''//...
End If
第三个是传递给searchPattern
或Directory.GetFiles()
的任何Directory.GetDirectories()
都直接传递给操作系统,Windows只能识别文件名,而不区分大小写。因此,您可以将文件夹和文件作为搜索模式传递,并以此方式进行查找。