public void CancelAsync_RequestOperationCancellationWhileWorkerSupportsCancellationIsFalse_ThrowsInvalidOperationException()
        {
            // arrange
            IBackgroundWorker worker = InitializeWorker();

            TestDelegate testDelegate = () => worker.CancelAsync();

            // act, assert
            Assert.That(testDelegate, Throws.Exception.TypeOf <InvalidOperationException>());
        }
        public void CancelAsync_RequestOperationCancellation_SetsCancellationPendingPropertyToTrue()
        {
            // arrange
            IBackgroundWorker worker = InitializeWorker();

            worker.WorkerSupportsCancellation = true;

            // act
            worker.CancelAsync();

            // assert
            Assert.IsTrue(worker.CancellationPending);
        }
        public void Run(RandomizerWorkerSettings settings, Action <List <AppFile> > onFinished, Action <string> onFailed, Action onCancelled)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }
            if (onFinished == null)
            {
                throw new ArgumentNullException("onFinished");
            }
            if (onFailed == null)
            {
                throw new ArgumentNullException("onFailed");
            }
            if (onCancelled == null)
            {
                throw new ArgumentNullException("onCancelled");
            }

            _backgroundWorker.WorkerSupportsCancellation = true;

            _backgroundWorker.OnDoWork += (sender, e) =>
            {
                List <AppFile> filesFound    = new List <AppFile>();
                List <AppFile> filesToCopy   = new List <AppFile>();
                List <AppFile> filesExisting = new List <AppFile>();

                if (!IsCancellationPending(e))
                {
                    if (settings.DeleteFromTargetFolder)
                    {
                        foreach (AppFile info in _fileService.GetFiles(settings.PathTo))
                        {
                            if (IsCancellationPending(e))
                            {
                                return;
                            }
                            _fileService.DeleteFile(info);
                        }
                    }
                }

                if (!IsCancellationPending(e))
                {
                    if (settings.OnDuplicateDoNotCopy)
                    {
                        foreach (AppFile file in _fileService.GetFiles(settings.PathTo))
                        {
                            if (IsCancellationPending(e))
                            {
                                return;
                            }
                            filesExisting.Add(file);
                        }
                    }
                }

                if (!IsCancellationPending(e) && settings.PathsFrom != null)
                {
                    foreach (string path in settings.PathsFrom)
                    {
                        foreach (AppFile file in _traverseService.TraverseFolder(path))
                        {
                            if (IsCancellationPending(e))
                            {
                                return;
                            }
                            filesFound.Add(file);
                        }
                    }
                }

                if (!IsCancellationPending(e))
                {
                    if (settings.SelectedLimit == LimitType.FilesTotalSize)
                    {
                        foreach (AppFile file in _fileService.GetFilesByMaxFileSize(settings.FindOnlyUniqueFiles, filesFound, filesExisting, settings.SizeLimitBytes))
                        {
                            if (IsCancellationPending(e))
                            {
                                return;
                            }
                            filesToCopy.Add(file);
                        }
                    }
                    else if (settings.SelectedLimit == LimitType.FilesNumber || settings.SelectedLimit == LimitType.FilesNumberPerFolder)
                    {
                        int filesNumber = 0;

                        if (settings.SelectedLimit == LimitType.FilesNumber)
                        {
                            filesNumber = settings.FilesNumberLimit;
                        }
                        else if (settings.SelectedLimit == LimitType.FilesNumberPerFolder)
                        {
                            filesNumber = settings.FoldersNumberLimit * settings.FilesNumberPerFolderLimit;
                        }

                        foreach (AppFile file in _fileService.GetFilesByFilesNumber(settings.FindOnlyUniqueFiles, filesFound, filesExisting, filesNumber))
                        {
                            if (IsCancellationPending(e))
                            {
                                return;
                            }
                            filesToCopy.Add(file);
                        }
                    }
                }

                e.Result = filesToCopy;
            };

            _backgroundWorker.OnRunWorkerCompleted += (sender, e) =>
            {
                if (e.Error != null)
                {
                    _uiContext.Post(x => onFailed(e.Error.Message), null);
                }
                else if (e.Cancelled)
                {
                    _uiContext.Post(x => onCancelled(), null);
                }
                else
                {
                    _uiContext.Post(x => onFinished((List <AppFile>)e.Result), null);
                }
            };

            if (_backgroundWorker.IsBusy)
            {
                _backgroundWorker.CancelAsync();
            }

            _backgroundWorker.RunWorkerAsync();
        }
Exemplo n.º 4
0
        public void Run(CopyWorkerParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }
            if (parameters.Settings == null)
            {
                throw new ArgumentNullException("settings");
            }
            if (parameters.OnStarted == null)
            {
                throw new ArgumentNullException("onStarted");
            }
            if (parameters.OnFileChanged == null)
            {
                throw new ArgumentNullException("onFileChanged");
            }
            if (parameters.OnProgressChanged == null)
            {
                throw new ArgumentNullException("onProgressChanged");
            }
            if (parameters.OnFinished == null)
            {
                throw new ArgumentNullException("onFinished");
            }
            if (parameters.OnFailed == null)
            {
                throw new ArgumentNullException("onFailed");
            }
            if (parameters.OnCancelled == null)
            {
                throw new ArgumentNullException("onCancelled");
            }

            _backgroundWorker.WorkerReportsProgress      = true;
            _backgroundWorker.WorkerSupportsCancellation = true;

            _backgroundWorker.OnProgressChanged += (sender, e) =>
            {
                _uiContext.Post(x => parameters.OnProgressChanged(e.ProgressPercentage), null);
                _uiContext.Post(x => parameters.OnFileChanged((AppFile)e.UserState), null);
            };

            _backgroundWorker.OnDoWork += (sender, e) =>
            {
                _uiContext.Post(x => parameters.OnStarted(), null);

                if (!IsCancellationPending(e))
                {
                    int index      = 1;
                    int filesCount = parameters.Settings.FilesToCopy.Count();

                    RenameAndSortFiles(parameters.Settings);

                    if (parameters.Settings.SelectedLimit == LimitType.FilesNumberPerFolder)
                    {
                        int    currentFolderIndex  = 0;
                        string pathTo              = "";
                        int    processedFilesCount = 0;

                        foreach (AppFile file in parameters.Settings.FilesToCopy)
                        {
                            if (currentFolderIndex == 0 || processedFilesCount == parameters.Settings.FilesPerFolderNumber)
                            {
                                ++currentFolderIndex;
                                processedFilesCount = 0;
                                pathTo = string.Format("{0}/CD{1:00}", parameters.Settings.PathTo, currentFolderIndex);
                                _fileSystem.CreateDirectory(pathTo);
                            }

                            string filePath = string.Format(CultureInfo.CurrentCulture, "{0}/{1}", pathTo, file.FileNameFull);

                            // if exists skip file copy and move to the next file
                            if (_fileSystem.FileExists(filePath))
                            {
                                if (parameters.Settings.OnDuplicateDoNotCopy)
                                {
                                    ReportProgress(file, ref index, filesCount);
                                    continue;
                                }
                                else if (parameters.Settings.OnDuplicateOverwrite)
                                {
                                    _fileSystem.DeleteFile(filePath);
                                }
                                else if (parameters.Settings.OnDuplicateAddPrefix || parameters.Settings.OnDuplicateAddSuffix)
                                {
                                    file.FileNameFull = _fileHelper.GenerateUniqueFileName(file, _charsGenerator, parameters.Settings.CharsPositionOnDuplicate);
                                }
                            }

                            if (IsCancellationPending(e))
                            {
                                return;
                            }

                            if (currentFolderIndex > parameters.Settings.FoldersNumber)
                            {
                                break;
                            }

                            _fileSystem.CopyTo(file.FilePath, string.Format(CultureInfo.CurrentCulture, "{0}/{1}", pathTo, file.FileNameFull));

                            ReportProgress(file, ref index, filesCount);

                            ++processedFilesCount;
                        }
                    }
                    else
                    {
                        foreach (AppFile file in parameters.Settings.FilesToCopy)
                        {
                            string filePath = string.Format(CultureInfo.CurrentCulture, "{0}/{1}", parameters.Settings.PathTo, file.FileNameFull);

                            // if exists skip file copy and move to the next file
                            if (_fileSystem.FileExists(filePath))
                            {
                                if (parameters.Settings.OnDuplicateDoNotCopy)
                                {
                                    ReportProgress(file, ref index, filesCount);
                                    continue;
                                }
                                else if (parameters.Settings.OnDuplicateOverwrite)
                                {
                                    _fileSystem.DeleteFile(filePath);
                                }
                                else if (parameters.Settings.OnDuplicateAddPrefix || parameters.Settings.OnDuplicateAddSuffix)
                                {
                                    file.FileNameFull = _fileHelper.GenerateUniqueFileName(file, _charsGenerator, parameters.Settings.CharsPositionOnDuplicate);
                                }
                            }

                            if (IsCancellationPending(e))
                            {
                                return;
                            }

                            _fileSystem.CopyTo(file.FilePath, string.Format(CultureInfo.CurrentCulture, "{0}/{1}", parameters.Settings.PathTo, file.FileNameFull));

                            ReportProgress(file, ref index, filesCount);
                        }
                    }
                }

                e.Result = true;
            };

            _backgroundWorker.OnRunWorkerCompleted += (sender, e) =>
            {
                if (e.Error != null)
                {
                    _uiContext.Post(x => parameters.OnFailed(e.Error.Message), null);
                }
                else if (e.Cancelled)
                {
                    _uiContext.Post(x => parameters.OnCancelled(), null);
                }
                else
                {
                    _uiContext.Post(x => parameters.OnFinished(), null);
                }
            };

            if (_backgroundWorker.IsBusy)
            {
                _backgroundWorker.CancelAsync();
            }

            _backgroundWorker.RunWorkerAsync();
        }