Member 13924789 Ответов: 1

Как скопировать/переместить файлы из папки в другую с помощью 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

1 Ответов

Рейтинг:
0

Gerry Schmitz

"Do_Work" обычно включает в себя "цикл", который выполняется до тех пор, пока не будет выполнено некоторое условие.

У вас нет "цикла"; вы просто обрабатываете настройки для одного файла. Вам нужна "очередь" файлов для фонового рабочего (или что-то подобное).

Работник запускается в любое время, когда он простаивает, и имена файлов добавляются в очередь.


Richard MacCutchan

А как насчет утверждения foreach?

Member 13924789

Я думаю, что это поможет мне, потому что я однажды переместил имя папки. Это должно быть что то вроде :-

string [] files = каталог.GetFiles(источник)
foreach(var file in files)
{
}

Спасибо я попробую там и дам вам знать