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