이 예제에서는 두 파일 목록을 비교하는 세 가지 방법을 보여 줍니다.
두 파일 목록이 동일한지 여부를 지정하는 부울 값을 쿼리합니다.
교차를 쿼리하여 두 폴더에 있는 파일을 검색합니다.
집합 차이를 쿼리하여 한 폴더에 있지만 다른 폴더에는 없는 파일을 검색합니다.
비고
여기에 표시된 기술은 모든 형식의 개체 시퀀스를 비교하도록 조정할 수 있습니다.
여기에 표시된 클래스는 FileComparer
표준 쿼리 연산자와 함께 사용자 지정 비교자 클래스를 사용하는 방법을 보여 줍니다. 이 클래스는 실제 시나리오에서 사용할 수 없습니다. 각 파일의 이름과 길이(바이트)를 사용하여 각 폴더의 내용이 동일한지 여부를 확인합니다. 실제 시나리오에서는 보다 엄격한 같음 검사를 수행하도록 이 비교자를 수정해야 합니다.
예시
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
코드 컴파일
Visual Basic 콘솔 애플리케이션 프로젝트를 만들어서, System.Linq 네임스페이스에 대한 Imports
문을 추가합니다.
참고하십시오
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET