Procedura: Confrontare il contenuto di due cartelle (LINQ) (Visual Basic)
In questo esempio vengono illustrati tre modi per confrontare due elenchi di file:
Eseguendo una query su un valore booleano che specifica se i due elenchi di file sono identici.
Eseguendo una query sull'intersezione per recuperare i file presenti in entrambe le cartelle.
Eseguendo una query sulla differenza tra set per recuperare i file che sono presenti in una cartella, ma non nell'altra.
Nota
Le tecniche illustrate di seguito possono essere adattate per confrontare le sequenze di oggetti di qualsiasi tipo.
La classe FileComparer
descritta in questo argomento illustra come usare una classe di operatori di confronto personalizzata insieme con gli operatori query standard. La classe non è destinata all'uso in scenari reali. Si limita a usare il nome e la lunghezza in byte di ogni file per determinare se il contenuto di ogni cartella è identico o meno. In uno scenario reale è necessario modificare questo operatore di confronto per eseguire un controllo di uguaglianza più rigoroso.
Esempio
Module CompareDirs
Public Sub Main()
' Create two identical or different temporary folders
' on a local drive and add files to them.
' Then set these file paths accordingly.
Dim pathA As String = "C:\TestDir"
Dim pathB As String = "C:\TestDir2"
' Take a snapshot of the file system.
Dim dir1 As New System.IO.DirectoryInfo(pathA)
Dim dir2 As New System.IO.DirectoryInfo(pathB)
Dim list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
Dim list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
' Create the FileCompare object we'll use in each query
Dim myFileCompare As New FileCompare
' This query determines whether the two folders contain
' identical file lists, based on the custom file comparer
' that is defined in the FileCompare class.
' The query executes immediately because it returns a bool.
Dim areIdentical As Boolean = list1.SequenceEqual(list2, myFileCompare)
If areIdentical = True Then
Console.WriteLine("The two folders are the same.")
Else
Console.WriteLine("The two folders are not the same.")
End If
' Find common files in both folders. It produces a sequence and doesn't execute
' until the foreach statement.
Dim queryCommonFiles = list1.Intersect(list2, myFileCompare)
If queryCommonFiles.Count() > 0 Then
Console.WriteLine("The following files are in both folders:")
For Each fi As System.IO.FileInfo In queryCommonFiles
Console.WriteLine(fi.FullName)
Next
Else
Console.WriteLine("There are no common files in the two folders.")
End If
' Find the set difference between the two folders.
' For this example we only check one way.
Dim queryDirAOnly = list1.Except(list2, myFileCompare)
Console.WriteLine("The following files are in dirA but not dirB:")
For Each fi As System.IO.FileInfo In queryDirAOnly
Console.WriteLine(fi.FullName)
Next
' Keep the console window open in debug mode
Console.WriteLine("Press any key to exit.")
Console.ReadKey()
End Sub
' This implementation defines a very simple comparison
' between two FileInfo objects. It only compares the name
' of the files being compared and their length in bytes.
Public Class FileCompare
Implements System.Collections.Generic.IEqualityComparer(Of System.IO.FileInfo)
Public Function Equals1(ByVal x As System.IO.FileInfo, ByVal y As System.IO.FileInfo) _
As Boolean Implements System.Collections.Generic.IEqualityComparer(Of System.IO.FileInfo).Equals
If (x.Name = y.Name) And (x.Length = y.Length) Then
Return True
Else
Return False
End If
End Function
' Return a hash that reflects the comparison criteria. According to the
' rules for IEqualityComparer(Of T), if Equals is true, then the hash codes must
' also be equal. Because equality as defined here is a simple value equality, not
' reference identity, it is possible that two or more objects will produce the same
' hash code.
Public Function GetHashCode1(ByVal fi As System.IO.FileInfo) _
As Integer Implements System.Collections.Generic.IEqualityComparer(Of System.IO.FileInfo).GetHashCode
Dim s As String = fi.Name & fi.Length
Return s.GetHashCode()
End Function
End Class
End Module
Compilare il codice
Creare un progetto di applicazione console di Visual Basic con un'istruzione Imports
per lo spazio dei nomi System.Linq.
Vedi anche
- LINQ to Objects (Visual Basic)
- LINQ and File Directories (Visual Basic) (LINQ e directory file (Visual Basic))