/// <summary>
        /// Compare directory level information from the two specified directory listings.
        /// </summary>
        public virtual void Compare(ref AdvancedDirectoryEntries entriesBef, ref AdvancedDirectoryEntries entriesAft)
        {
            SignalBeginProgress("Changes");
            try
            {
                //Identify entries which are common to both before and after directory listings.
                //This is accomplished using a LINQ query fashioned to implement an inner join.
                List <AdvancedDirectoryEntry> innerEntries = (List <AdvancedDirectoryEntry>)(from b in entriesBef
                                                                                             join a in entriesAft
                                                                                             on new { b.StdDir, b.StdFile } equals new { a.StdDir, a.StdFile }
                                                                                             select new AdvancedDirectoryEntry(a.StdHlq, a.StdDir, a.StdFile, a.StdSize, a.StdDate, a.StdDate, b.StdDate, a.StdHlq, a.StdFile, b.StdHlq, b.StdFile, a.StdType, "BOTH")).ToList();

                //Identify entries which have been deleted.
                //This is accomplished using a LINQ query fashioned to implement a left join
                //then selecting entries which only exist on the left side (before side) of the join.
                List <AdvancedDirectoryEntry> deletedEntries = (List <AdvancedDirectoryEntry>)(from b in entriesBef
                                                                                               join a in entriesAft
                                                                                               on new { b.StdDir, b.StdFile } equals new { a.StdDir, a.StdFile }
                                                                                               into changes
                                                                                               from c in changes.DefaultIfEmpty(new AdvancedDirectoryEntry())
                                                                                               where c.CtlComparison == "EMPTY"
                                                                                               select new AdvancedDirectoryEntry(b.StdHlq, b.StdDir, b.StdFile, b.StdSize, b.StdDate, DateTime.MinValue, b.StdDate, this.targetHlq, b.StdFile, b.StdHlq, b.StdFile, b.StdType, "DELETED")).ToList();

                //Identify entries which have been inserted.
                //This is accomplished using a LINQ query fashioned to implement a left join
                //then selecting entries which only exist on the left side (after side) of the join.
                List <AdvancedDirectoryEntry> insertedEntries = (List <AdvancedDirectoryEntry>)(from a in entriesAft
                                                                                                join b in entriesBef
                                                                                                on new { a.StdDir, a.StdFile } equals new { b.StdDir, b.StdFile }
                                                                                                into changes
                                                                                                from c in changes.DefaultIfEmpty(new AdvancedDirectoryEntry())
                                                                                                where c.CtlComparison == "EMPTY"
                                                                                                select new AdvancedDirectoryEntry(a.StdHlq, a.StdDir, a.StdFile, a.StdSize, a.StdDate, a.StdDate, DateTime.MinValue, a.StdHlq, a.StdFile, this.targetHlq, a.StdFile, a.StdType, "INSERTED")).ToList();
                //Reconstruct the before list.
                entriesBef = new AdvancedDirectoryEntries();
                entriesBef.AddRange(innerEntries);
                entriesBef.AddRange(deletedEntries);

                //Reconstruct the after list.
                entriesAft = new AdvancedDirectoryEntries();
                entriesAft.AddRange(innerEntries);
                entriesAft.AddRange(insertedEntries);
            }
            catch (Exception oException)
            {
                System.Diagnostics.Debug.WriteLine(oException.Message);
            }
            finally
            {
            }
        }
        /// <summary>
        /// Store details of changes to the specified change list.
        /// </summary>
        public void Changes(AdvancedDirectoryEntries entriesBef, AdvancedDirectoryEntries entriesAft, ref AdvancedDirectoryEntries entriesChg, ref long estimate)
        {
            estimate = 0;
            try
            {
                AdvancedDirectoryEntries deletedEntries = new AdvancedDirectoryEntries((from b in entriesBef
                                                                                        where b.CtlComparison == "DELETED"
                                                                                        select b).ToList());
                SignalUpdateProgress("Changes", 1);

                AdvancedDirectoryEntries innerEntries = new AdvancedDirectoryEntries((from b in entriesBef
                                                                                      where b.CtlComparison == "BOTH"
                                                                                      select b).ToList());
                SignalUpdateProgress("Changes", 1);

                AdvancedDirectoryEntries insertedEntries = new AdvancedDirectoryEntries((from a in entriesAft
                                                                                         where a.CtlComparison == "INSERTED"
                                                                                         select a).ToList());
                SignalUpdateProgress("Changes", 1);

                entriesChg = new AdvancedDirectoryEntries();
                entriesChg.AddRange(deletedEntries);
                entriesChg.AddRange(innerEntries);
                entriesChg.AddRange(insertedEntries);
                SignalUpdateProgress("Changes", 1);
            }
            catch (OleDbException oException)
            {
                System.Diagnostics.Debug.WriteLine(oException.Errors[0].Message);
            }
            finally
            {
            }
            SignalEndOfProgress("Changes");

            //Generate comparisons collection.
            GenerateComparisons(entriesChg, ref estimate);
        }