문제

디렉토리를 반복하고 지정된 폴더 및 파일을 확인하는 다음 기능이 있습니다.

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 확장자는 값과 함께 비교 인수를 가질 수 있습니다. 나는 Google과 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.

이 오류가 무엇을 의미하는지, 어떻게 수정하는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

글쎄, 당신은 비교를 구현할 수 있지만,이 경우 어려운 방법 일 것입니다. 대신 몇 가지 다른 옵션이 있습니다.

첫 번째는 이미 사용할 수있는 경우에 민감한 비교기가 있다는 것입니다. 실제로 부부가 있습니다. 당신의 지능적인 프롬프트를 살펴보십시오 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는 파일 이름에 대한 대변인 일뿐 아니라 사례에 민감하지 않습니다. 따라서 폴더와 파일을 검색 패턴으로 전달하고 그런 식으로 조회 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top