internal DirectoryDiffResults( DirectoryInfo directoryA, DirectoryInfo directoryB, DirectoryDiffEntryCollection entries, bool recursive, DirectoryDiffFileFilter?filter) { this.directoryA = directoryA; this.directoryB = directoryB; this.entries = entries; this.recursive = recursive; this.filter = filter; }
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; } } }