public static DirectoryObjectDiff CompareDirectories(DirectoryObject left, DirectoryObject right, string leftName = "", string rightName = "")
        {
            var result = new DirectoryObjectDiff() { LeftName = leftName, RightName = rightName };


            compareDirectoriesHelper(left, right, result);
            

            return result;
        }
Exemple #2
0
        public static DirectoryObjectDiff CompareDirectories(DirectoryObject left, DirectoryObject right, string leftName = "", string rightName = "")
        {
            var result = new DirectoryObjectDiff()
            {
                LeftName = leftName, RightName = rightName
            };


            compareDirectoriesHelper(left, right, result);


            return(result);
        }
        private static void compareDirectoriesHelper(DirectoryObject left, DirectoryObject right, DirectoryObjectDiff result)
        {

            //      ##  Items missing in left Directory  ##

            //find directories that exist in right but not in left
            var dirsMissingLeft = right.Directories.Where(x => !left.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower()))                                                
                                                   .Select(x => getAllSubdirectories(x))   
                                                   .Aggregate((l1, l2) => l1.Union<DirectoryObject>(l2));

            //find files that exist in right but not in left
            var filesMissingLeft = right.Files.Where(x => !left.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()));
            //add all files from all the directories missing from left
            filesMissingLeft = filesMissingLeft.Union(dirsMissingLeft.Select(x => x.Files).Aggregate((l1, l2) => l1.Union(l2)));

            //copy directories in the list and remove the files
            dirsMissingLeft = dirsMissingLeft.Select(x => { var copy = x.Clone(0); copy.ClearFiles(); return copy; });



            //      ##  Items missing in right Directory    ##  

            //find directories that exist in left but not in right
            var dirsMissingRight = left.Directories.Where(x => !right.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower()))
                                                   .Select(x => getAllSubdirectories(x))
                                                   .Aggregate((l1, l2) => l1.Union<DirectoryObject>(l2));
                                                  

            //find files that exist in left but not in right
            var filesMissingRight = left.Files.Where(x => !right.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()));
            //add all files from all the directories missing from right
            filesMissingRight = filesMissingRight.Union(dirsMissingRight.Select(x => x.Files).Aggregate((l1, l2) => l1.Union(l2)));

            //make dirsMissingLeft (list of trees) to a simple list of directories (minus files)
            dirsMissingRight = dirsMissingRight.Select(x => { var copy = x.Clone(0); copy.ClearFiles(); return copy; });



            //      ##  Conflicts   ##

            //find files that exist in both directories but are not equal
            var fileConflicts = right.Files.Where(x => left.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()))
                                           .Select(x => new Tuple<FileObject, FileObject>(left.GetFile(x.Name), x))
                                           .Where(x => !compareFileObject(x.Item1, x.Item2));


            //add the newy-found conflicts to the existing result
            result.DirectoriesMissigFromLeft = result.DirectoriesMissigFromLeft.Union<DirectoryObject>(dirsMissingLeft).ToList<DirectoryObject>();
            result.DirectoriesMissingFromRight = result.DirectoriesMissingFromRight.Union<DirectoryObject>(dirsMissingRight).ToList<DirectoryObject>();

            result.FilesMissingFromLeft = result.FilesMissingFromLeft.Union<FileObject>(filesMissingLeft);
            result.FilesMissingFromRight = result.FilesMissingFromRight.Union<FileObject>(filesMissingRight);


            //      ##  Recursion   ##

            foreach (var item in left.Directories.Where(x => right.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower())))
            {
                compareDirectoriesHelper(item, right.GetDirectory(item.Name), result);
            }


        }
Exemple #4
0
        private static void compareDirectoriesHelper(DirectoryObject left, DirectoryObject right, DirectoryObjectDiff result)
        {
            //      ##  Items missing in left Directory  ##

            //find directories that exist in right but not in left
            var dirsMissingLeft = right.Directories.Where(x => !left.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower()))
                                  .Select(x => getAllSubdirectories(x))
                                  .Aggregate((l1, l2) => l1.Union <DirectoryObject>(l2));

            //find files that exist in right but not in left
            var filesMissingLeft = right.Files.Where(x => !left.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()));

            //add all files from all the directories missing from left
            filesMissingLeft = filesMissingLeft.Union(dirsMissingLeft.Select(x => x.Files).Aggregate((l1, l2) => l1.Union(l2)));

            //copy directories in the list and remove the files
            dirsMissingLeft = dirsMissingLeft.Select(x => { var copy = x.Clone(0); copy.ClearFiles(); return(copy); });



            //      ##  Items missing in right Directory    ##

            //find directories that exist in left but not in right
            var dirsMissingRight = left.Directories.Where(x => !right.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower()))
                                   .Select(x => getAllSubdirectories(x))
                                   .Aggregate((l1, l2) => l1.Union <DirectoryObject>(l2));


            //find files that exist in left but not in right
            var filesMissingRight = left.Files.Where(x => !right.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()));

            //add all files from all the directories missing from right
            filesMissingRight = filesMissingRight.Union(dirsMissingRight.Select(x => x.Files).Aggregate((l1, l2) => l1.Union(l2)));

            //make dirsMissingLeft (list of trees) to a simple list of directories (minus files)
            dirsMissingRight = dirsMissingRight.Select(x => { var copy = x.Clone(0); copy.ClearFiles(); return(copy); });



            //      ##  Conflicts   ##

            //find files that exist in both directories but are not equal
            var fileConflicts = right.Files.Where(x => left.Files.Any(y => y.Name.ToLower() == x.Name.ToLower()))
                                .Select(x => new Tuple <FileObject, FileObject>(left.GetFile(x.Name), x))
                                .Where(x => !compareFileObject(x.Item1, x.Item2));


            //add the newy-found conflicts to the existing result
            result.DirectoriesMissigFromLeft   = result.DirectoriesMissigFromLeft.Union <DirectoryObject>(dirsMissingLeft).ToList <DirectoryObject>();
            result.DirectoriesMissingFromRight = result.DirectoriesMissingFromRight.Union <DirectoryObject>(dirsMissingRight).ToList <DirectoryObject>();

            result.FilesMissingFromLeft  = result.FilesMissingFromLeft.Union <FileObject>(filesMissingLeft);
            result.FilesMissingFromRight = result.FilesMissingFromRight.Union <FileObject>(filesMissingRight);


            //      ##  Recursion   ##

            foreach (var item in left.Directories.Where(x => right.Directories.Any(y => y.Name.ToLower() == x.Name.ToLower())))
            {
                compareDirectoriesHelper(item, right.GetDirectory(item.Name), result);
            }
        }