private HashResult Hash(FileInfo[] input, DirComparatorSide side)
        {
            MD5 md5       = MD5.Create();
            int totalops  = input.Length;
            int currentop = 0;
            Dictionary <string, FileInfo>         files      = new Dictionary <string, FileInfo>();
            List <DirComparatorDuplicateFileInfo> duplicates = new List <DirComparatorDuplicateFileInfo>();

            foreach (FileInfo file in input)
            {
                currentop++;
                StatusChanged?.Invoke(new DirComparatorStatus()
                {
                    Side = side, Action = DirComparatorAction.Hashing, CurrentFile = file, CurentOperation = currentop, TotalOperations = totalops
                });
                string hash = Convert.ToBase64String(md5.ComputeHash(file.OpenRead()));
                if (files.ContainsKey(hash))
                {
                    duplicates.Add(new DirComparatorDuplicateFileInfo()
                    {
                        Type = DirComparatorFileInfo.FileType.Duplicate, File = files[hash], Duplicate = file
                    });
                }
                else
                {
                    files.Add(hash, file);
                }
            }
            return(new HashResult()
            {
                Files = files, Duplicates = duplicates
            });
        }
        private FileInfo[] Filter(FileInfo[] input, DirComparatorSide side)
        {
            int             totalops  = input.Length;
            int             currentop = 0;
            List <FileInfo> files     = new List <FileInfo>();

            foreach (FileInfo file in input)
            {
                StatusChanged?.Invoke(new DirComparatorStatus()
                {
                    Action = DirComparatorAction.Filtering, Side = side, CurentOperation = currentop, TotalOperations = totalops, CurrentFile = file
                });
                if (!ignore.IsMatch(file.FullName))
                {
                    files.Add(file);
                }
                currentop++;
            }
            return(files.ToArray());
        }