public void KickOffFileSearch()
        {
            string pattern = this.FileSearchPattern.Pattern;

            string folder = this.CurrentFolderPath;

            _taskCounter.IncreaseNumberOfOutstandingTasks();

            this.FileSearchPattern.IsSearchEnabled = false;

            ThreadPool.QueueUserWorkItem(
                delegate
            {
                try
                {
                    bool gotEmAll = false;

                    var files = new List <FileInfo>();

                    while (!gotEmAll)
                    {
                        files.Clear();

                        using (IEnumerator <FileInfo> fileEnumerator = _virtualSystemCurrentlyBrowsed.EnumerateFilesUnderFolder(folder, pattern))
                        {
                            try
                            {
                                while (fileEnumerator.MoveNext())
                                {
                                    files.Add(fileEnumerator.Current);
                                }

                                gotEmAll = true;
                            }
                            catch (ObjectDisposedException)
                            {
                                gotEmAll = true;
                            }
                            catch (InvalidOperationException)
                            {
                                // содержимое папки изменилось - не сдаемся.
                                // Note: может привести и приводит к большой трате ресурсов, если, скажем, делать поиск по корню
                                // и одновременно менять что-то в папках диска. Наверное, стоило делать итератор менее строгим, пусть бы он
                                // сделался непохожим на другие итераторы (полный отрыв от изменений я сделал в копировании и импорте).
                            }
                        }
                    }

                    _applicationController.PresentListOfStrings(
                        "Результаты рекурсивного поиска файлов по маске \"{0}\" в папке \"{1}\"".FormatWith(
                            pattern, folder), files.Select(file => file.FullPath));
                }
                finally
                {
                    this.FileSearchPattern.IsSearchEnabled = true;
                    _taskCounter.DecreaseNumberOfOutstandingTasks();
                }
            });
        }
예제 #2
0
        public void VisitFile(FileViewModel fileViewModel)
        {
            if (fileViewModel == null)
            {
                throw new ArgumentNullException("fileViewModel");
            }

            var pathViewModel = new VirtualFolderPathViewModel(_pathValidator)
            {
                Path = VirtualFileSystem.Root
            };

            if (_userInteractionService.GetVirtualFolderPath(pathViewModel))
            {
                var taskToken = new FileSystemCancellableTaskToken();

                _taskViewModel = new TaskViewModel(
                    "Копирование файла \"{0}\" по следующему пути \"{1}\"".FormatWith(fileViewModel.FullPath, pathViewModel.Path),
                    _applicationController,
                    taskToken);

                _taskCounter.IncreaseNumberOfOutstandingTasks();

                ThreadPool.QueueUserWorkItem(
                    delegate
                {
                    try
                    {
                        _fileSystem.CopyFile(fileViewModel.FullPath, pathViewModel.Path, taskToken);
                        _taskViewModel.SetResult(new[] { new TaskResultViewModel(fileViewModel.FullPath, pathViewModel.Path, true, String.Empty) });
                    }
                    catch (TaskCancelledException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (FileNotFoundException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (FileLockedException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (InvalidPathException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (FileAlreadyExistsException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (FolderNotFoundException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (MaximumFileCountReachedException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    catch (InsufficientSpaceException exception)
                    {
                        this.SetCopyFileError(fileViewModel.FullPath, pathViewModel.Path, exception);
                    }
                    finally
                    {
                        MarkTaskViewModelAsCompleted(_taskViewModel);
                        _taskCounter.DecreaseNumberOfOutstandingTasks();
                    }
                });
            }
        }