質問

私は、指定したフォルダとファイルのディレクトリとチェックをループし、次の機能を持っています

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

そして第三には、任意のsearchPatternDirectory.GetFiles()に渡されたかDirectory.GetDirectories()は、オペレーティングシステムに直接渡され、Windowsのみの場合を意識したファイル名、大文字と小文字を区別しないためであるということです。だから、検索パターンとして、あなたのフォルダやファイルを渡すと、そのように、あなたの検索を行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top