private void Execute(DirectoryInfo directoryA, DirectoryInfo directoryB, DirectoryDiffEntry entry, bool checkIfFilesAreDifferent) { // Get the arrays of files FileInfo[] filesA, filesB; if (this.filter == null) { filesA = directoryA.GetFiles(); filesB = directoryB.GetFiles(); // Sort them Array.Sort(filesA, this.comparer); Array.Sort(filesB, this.comparer); } else { filesA = this.filter.Filter(directoryA); filesB = this.filter.Filter(directoryB); } // Diff them this.DiffFileSystemInfos(filesA, filesB, entry, true, checkIfFilesAreDifferent); // Get the arrays of subdirectories DirectoryInfo[] directoriesA = directoryA.GetDirectories(); DirectoryInfo[] directoriesB = directoryB.GetDirectories(); // Sort them Array.Sort(directoriesA, this.comparer); Array.Sort(directoriesB, this.comparer); // Diff them this.DiffFileSystemInfos(directoriesA, directoriesB, entry, false, checkIfFilesAreDifferent); }
private void DiffFileSystemInfos(FileSystemInfo[] infosA, FileSystemInfo[] infosB, DirectoryDiffEntry entry, bool isFile, bool checkIfFilesAreDifferent) { int indexA = 0; int indexB = 0; int countA = infosA.Length; int countB = infosB.Length; DirectoryDiffEntryCollection subentries = entry.Subentries ?? throw Exceptions.NewInvalidOperationException("Subentries should not be null."); while (indexA < countA && indexB < countB) { FileSystemInfo infoA = infosA[indexA]; FileSystemInfo infoB = infosB[indexB]; int compareResult = this.comparer.Compare(infoA, infoB); if (compareResult == 0) { // The item is in both directories if (this.showDifferent || this.showSame) { bool different = false; DirectoryDiffEntry newEntry = new(infoA.Name, isFile, true, true, false); if (isFile) { if (checkIfFilesAreDifferent) { try { different = DiffUtility.AreFilesDifferent((FileInfo)infoA, (FileInfo)infoB); } catch (IOException ex) { newEntry.Error = ex.Message; } catch (UnauthorizedAccessException ex) { newEntry.Error = ex.Message; } newEntry.Different = different; } if ((different && this.showDifferent) || (!different && this.showSame)) { subentries.Add(newEntry); } } else { if (this.recursive) { this.Execute((DirectoryInfo)infoA, (DirectoryInfo)infoB, newEntry, checkIfFilesAreDifferent); } if (this.ignoreDirectoryComparison) { newEntry.Different = false; } else { different = newEntry.Different; } if (this.ignoreDirectoryComparison || (different && this.showDifferent) || (!different && this.showSame)) { subentries.Add(newEntry); } } if (different) { entry.Different = true; } } indexA++; indexB++; } else if (compareResult < 0) { // The item is only in A if (this.showOnlyInA) { subentries.Add(new DirectoryDiffEntry(infoA.Name, isFile, true, false, false)); entry.Different = true; } indexA++; } else { // iCompareResult > 0 // The item is only in B if (this.showOnlyInB) { subentries.Add(new DirectoryDiffEntry(infoB.Name, isFile, false, true, false)); entry.Different = true; } indexB++; } } // Add any remaining entries if (indexA < countA && this.showOnlyInA) { for (int i = indexA; i < countA; i++) { subentries.Add(new DirectoryDiffEntry(infosA[i].Name, isFile, true, false, false)); entry.Different = true; } } else if (indexB < countB && this.showOnlyInB) { for (int i = indexB; i < countB; i++) { subentries.Add(new DirectoryDiffEntry(infosB[i].Name, isFile, false, true, false)); entry.Different = true; } } }