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(); } }); }
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(); } }); } }