コード例 #1
0
 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;
 }
コード例 #2
0
        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;
                }
            }
        }