Question

J'ai la fonction suivante qui boucle à travers un répertoire et vérifie un dossier spécifié et le fichier:

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

La raison pour laquelle je l'ai fait cette méthode est que je puisse faire en sorte que les éléments dans chaque liste et le fichier / dossier passé étaient minuscules, sinon je l'aurais fait quelque chose comme ceci:

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

Mon collègue m'a dit quelque chose tout à l'heure au sujet d'être en mesure d'ignorer le cas en utilisant un comparateur. L'extension .Contains peut avoir un argument comparateur ainsi que la valeur. Je l'ai fait quelques recherches sur Google et MSDN, et est venu avec le comparateur suivant:

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

Quand il arrive à la ligne de theCompare(x.name, y.name) = 0, il des erreurs sur ce qui est le message d'erreur:

  

At least one object must implement IComparable.

Quelqu'un sait ce que signifie cette erreur et comment s'y prendre pour la corriger?

Était-ce utile?

La solution

Eh bien, vous pouvez mettre en œuvre un comparateur, mais ce serait la dure dans ce cas. Vous avez un couple d'autres options disponibles à la place.

La première est qu'il existe déjà un comparateur insensible à la casse, vous pouvez utiliser. Il y a un couple en fait. Regardez dans vos invites IntelliSense sous System.StringComparer.

La seconde est que les chaînes ont déjà intégré un moyen de spécifier la casse comparer:

Dim s As String = "a"
Dim t As String = "A"
If s.Equals(t, StringComparison.InvariantCultureIgnoreCase) Then
   ''//...
End If

Et un troisième est que tout searchPattern passé à Directory.GetFiles() ou Directory.GetDirectories() est transmis directement au système d'exploitation, et Windows est seulement conscient cas pour les noms de fichiers, pas la casse. Ainsi, vous pouvez passer votre dossier et fichier en tant que modèle de recherche et de faire votre recherche de cette façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top