public abstract void PurgeFiles(IEnumerable<string> files, IEnumerable<string> folders, PurgeProgressHandler handler=null);
        public override void PurgeFiles(IEnumerable <string> filesIn, IEnumerable <string> foldersIn, PurgeProgressHandler handler = null)
        {
            HashSet <string> limitFiles   = new HashSet <string>(filesIn.Select(x => x.Replace('\\', '/')));
            HashSet <string> limitFolders = new HashSet <string>(foldersIn.Select(x => x.Replace('\\', '/')));

            // We can't modify the list we're iterating over, and DeleteFile does modify it
            string[] iterateFiles = this.files.ToArray();
            foreach (string file in iterateFiles)
            {
                if (!limitFiles.Contains(file))
                {
                    this.DeleteFile(file);
                    if (handler != null && !handler(Entity.File, file, true))
                    {
                        return;
                    }
                }
                else
                {
                    if (handler != null && !handler(Entity.File, file, false))
                    {
                        return;
                    }
                }
            }

            string[] iterateFolders = this.folders.ToArray();
            foreach (string folder in iterateFolders)
            {
                if (!limitFolders.Contains(folder))
                {
                    this.DeleteFolder(folder);
                    if (handler != null && !handler(Entity.Folder, folder, true))
                    {
                        return;
                    }
                }
                else
                {
                    if (handler != null && !handler(Entity.Folder, folder, false))
                    {
                        return;
                    }
                }
            }
        }
        public override void PurgeFiles(IEnumerable<string> filesIn, IEnumerable<string> foldersIn, PurgeProgressHandler handler=null) {
            HashSet<string> limitFiles = new HashSet<string>(filesIn.Select(x => x.Replace('\\', '/')));
            HashSet<string> limitFolders = new HashSet<string>(foldersIn.Select(x => x.Replace('\\', '/')));

            // We can't modify the list we're iterating over, and DeleteFile does modify it
            string[] iterateFiles = this.files.ToArray();
            foreach (string file in iterateFiles) {
                if (!limitFiles.Contains(file)) {
                    this.DeleteFile(file);
                    if (handler != null && !handler(Entity.File, file, true))
                        return;
                }
                else {
                    if (handler != null && !handler(Entity.File, file, false))
                        return;
                }
            }

            string[] iterateFolders = this.folders.ToArray();
            foreach (string folder in iterateFolders) {
                if (!limitFolders.Contains(folder)) {
                    this.DeleteFolder(folder);
                    if (handler != null && !handler(Entity.Folder, folder, true))
                        return;
                }
                else {
                    if (handler != null && !handler(Entity.Folder, folder, false))
                        return;
                }
            }
        }
        public override void PurgeFiles(IEnumerable<string> filesIn, IEnumerable<string> foldersIn, PurgeProgressHandler handler=null) {
            HashSet<string> files = new HashSet<string>(filesIn);
            HashSet<string> folders = new HashSet<string>(foldersIn);
            // Just use a TreeTraverser here
            TreeTraverser treeTraverser = new TreeTraverser(this.Dest);

            foreach (TreeTraverser.FolderEntry folder in treeTraverser.ListFolders()) {
                try {
                    if (folders.Contains(folder.RelPath)) {
                        if (handler != null && !handler(Entity.Folder, folder.RelPath, false))
                            return;
                        foreach (TreeTraverser.FileEntry file in folder.GetFiles()) {
                            if (!files.Contains(file.RelPath)) {
                                File.Delete(file.FullPath);
                                if (handler != null && !handler(Entity.File, file.RelPath, true))
                                    return;
                            }
                            else {
                                if (handler != null && !handler(Entity.File, file.RelPath, false))
                                    return;
                            }
                        }
                    }
                    else {
                        Directory.Delete(folder.FullPath);
                        if (handler != null && !handler(Entity.Folder, folder.RelPath, true))
                            return;
                    }
                }
                // Don't yet have a way of logging from in here
                catch (BackupOperationException) { }
            }
        }
        public override void PurgeFiles(IEnumerable <string> filesIn, IEnumerable <string> foldersIn, PurgeProgressHandler handler = null)
        {
            HashSet <string> files   = new HashSet <string>(filesIn);
            HashSet <string> folders = new HashSet <string>(foldersIn);
            // Just use a TreeTraverser here
            TreeTraverser treeTraverser = new TreeTraverser(this.Dest);

            foreach (TreeTraverser.FolderEntry folder in treeTraverser.ListFolders())
            {
                try {
                    if (folders.Contains(folder.RelPath))
                    {
                        if (handler != null && !handler(Entity.Folder, folder.RelPath, false))
                        {
                            return;
                        }
                        foreach (TreeTraverser.FileEntry file in folder.GetFiles())
                        {
                            if (!files.Contains(file.RelPath))
                            {
                                File.Delete(file.FullPath);
                                if (handler != null && !handler(Entity.File, file.RelPath, true))
                                {
                                    return;
                                }
                            }
                            else
                            {
                                if (handler != null && !handler(Entity.File, file.RelPath, false))
                                {
                                    return;
                                }
                            }
                        }
                    }
                    else
                    {
                        Directory.Delete(folder.FullPath);
                        if (handler != null && !handler(Entity.Folder, folder.RelPath, true))
                        {
                            return;
                        }
                    }
                }
                // Don't yet have a way of logging from in here
                catch (BackupOperationException) { }
            }
        }
 public abstract void PurgeFiles(IEnumerable <string> files, IEnumerable <string> folders, PurgeProgressHandler handler = null);