سؤال

لدي الوظيفة التالية التي تحلقها من خلال دليل وهيكات لمجلد محدد وملف:

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() يتم تمريرها مباشرة إلى نظام التشغيل، ويندوز ليست سوى كحرف تدرك أسماء الملفات، وليس حساسة لحالة الأحرف. حتى تتمكن من اجتياز المجلد والملف كأنما نمط بحث وقم بإجراء بحثك بهذه الطريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top