Как скопировать/переместить файлы из папки в другую с помощью backgroundworker C#
Привет,
Я готов копировать/перемещать файлы из одной папки в другую, выбрав путь к исходной папке и папке назначения в моем представлении.
Я сделал код, и я могу выбрать пути, но я не могу заставить их перемещать файлы или копировать. Он перемещает только один файл, используя статический метод "MoveTo"
Я использую призму WPF MVVM, и я боролся в течение 3 полных дней, чтобы заставить это работать. У меня есть тысячи файлов, которые я получаю в день, поэтому я работаю над тем, чтобы сделать самый простой способ для пользователей работать над ними.
Код, который я опубликовал ниже, - это моя ViewModel, тогда я связываю эти кнопки и текстовые блоки в своем представлении
Что я уже пробовал:
class MoveViewModel : BindableBase { public string Title { get; internal set; } readonly BackgroundWorker worker = new BackgroundWorker(); private string to; private string from; private int progressBar; public int Progress { get { return progressBar; } set { SetProperty(ref progressBar, value); } } public string From { get { return from; } set { SetProperty(ref from, value); } } public string To { get { return to; } set { SetProperty(ref to, value); } } public ICommand Click_From { get; private set; } public ICommand Click_To { get; private set; } public ICommand Click_Move { get; private set; } public MoveViewModel() { Click_From = new DelegateCommand(ClickFrom); Click_To = new DelegateCommand(ClickTo); Click_Move = new DelegateCommand(ClickMove); worker.WorkerSupportsCancellation = true; worker.WorkerReportsProgress = true; worker.DoWork += Worker_DoWork; worker.RunWorkerCompleted += Worker_RunWorkerCompleted; worker.ProgressChanged += Worker_ProgressChanged; } private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Progress = e.ProgressPercentage; } private void ClickFrom() { try { FolderBrowserDialog dialog = new FolderBrowserDialog(); if(dialog.ShowDialog() == DialogResult.OK) { From = dialog.SelectedPath; } } catch (Exception e) { MessageBox.Show(e.Message); } } private void ClickTo() { try { FolderBrowserDialog fbd = new FolderBrowserDialog(); if (fbd.ShowDialog() == DialogResult.OK) { To = Path.Combine(fbd.SelectedPath, Path.GetFileName(From)); } } catch (Exception e) { MessageBox.Show(e.Message); } } void MoveFile(string source, string destination) { try { if(Directory.Exists(source)) { foreach(var file in new DirectoryInfo(source).GetFiles()) { file.MoveTo(destination); } } } catch (Exception e) { System.Windows.MessageBox.Show(e.Message); } } private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } private void Worker_DoWork(object sender, DoWorkEventArgs e) { string source = From; string destination = To; MoveFile(source, destination); } private void ClickMove() { try { worker.RunWorkerAsync(); } catch(Exception e) { MessageBox.Show(e.Message); } } } }
Richard MacCutchan
Вам нужно использовать свой отладчик, чтобы проверить, сколько файлов возвращается DirectoryInfo(source).GetFiles()
Если это больше, чем один, то проверьте, что на самом деле происходит в цикле.
Member 13924789
Давайте попробуем это сделать
George Swan
Попробуйте использовать каталог.EnumerateFiles вместо GetFiles. Кроме того, я думаю, что вам нужно быть в потоке пользовательского интерфейса, чтобы всплывающее окно сообщения, поэтому неразумно делать это в рабочем потоке. Я предпочитаю использовать асинхронный шаблон на основе задач, а не BackgroundWorker, здесь есть хороший пример https://docs.microsoft.com/en-us/dotnet/standard/io/asynchronous-file-i-o