копирование файлов с прогрессом

90
03 января 2022, 06:50

У меня небольшая программка, которая копирует файлы с папками с одного места в указанное. Хотелось бы прикрутить ProgressBar для отображения копирования, так как если будет большой обьем копирования, будет создаваться ощущение зависания компа.

SettingsDirectory settings;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForUpdates();
            bckWorker.WorkerReportsProgress = true;
            bckWorker.ProgressChanged += bckWorker_ProgressChanged;
        }
        private void CheckForUpdates()
        {
            settings = new SettingsDirectory();
            settings = settings.LoadFile();    
            try
            {
                UpdateDirectory(settings.UpdateBeginDirectory, settings.UpdateEndDirectory);
                 Process.Start(settings.LocalMainExe);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void UpdateDirectory(string begin_dir, string end_dir)
        {
            try
            {               
                DirectoryInfo dir_inf = new DirectoryInfo(begin_dir);
                foreach (DirectoryInfo dir in dir_inf.GetDirectories())
                {
                    if (Directory.Exists(end_dir + "\\" + dir.Name) != true)
                    {
                        Directory.CreateDirectory(end_dir + "\\" + dir.Name);
                    }
                    UpdateDirectory(dir.FullName, end_dir + "\\" + dir.Name);
                }
                foreach (string file in Directory.GetFiles(begin_dir))
                {
                    string filik = file.Substring(file.LastIndexOf('\\'), file.Length - file.LastIndexOf('\\'));
                    File.Copy(file, end_dir + "\\" + filik, true);
                }               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void bckWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //statusLabel.Text = String.Format("Загружено: {0} Кбайт / {1} Кбайт", e.BytesReceived / 1024, e.TotalBytesToReceive / 1024);
            progressBar1.Value = e.ProgressPercentage;
        }

не доеду как правильно привинтить процесс с прогрессом.

Если процесс копирования переношу в DoWork то ничего не происходит

private void Form1_Load(object sender, EventArgs e)
        {
            //CheckForUpdates();
            bckWorker.WorkerReportsProgress = true;
            bckWorker.DoWork += bckWorker_DoWork;
            bckWorker.ProgressChanged += bckWorker_ProgressChanged;
        }
 private void bckWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            UpdateDirectory(settings.UpdateBeginDirectory, settings.UpdateEndDirectory);
            Process.Start(settings.LocalMainExe);
            Environment.Exit(0);
        }
public partial class Form1 : Form
    {
        private int percentageProgress = 0;
        SettingsDirectory settings;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                bckWorker.WorkerReportsProgress = true;
                bckWorker.DoWork += bckWorker_DoWork;
                bckWorker.RunWorkerCompleted += bckWorker_RunWorkerCompleted;
                bckWorker.ProgressChanged += bckWorker_ProgressChanged;
                bckWorker.RunWorkerAsync();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void CheckForUpdates()
        {
            settings = new SettingsDirectory();
            settings = settings.LoadFile();    
            try
            {
                UpdateDirectory(settings.UpdateBeginDirectory, settings.UpdateEndDirectory);
                Process.Start(settings.LocalMainExe);                    
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void UpdateDirectory(string begin_dir, string end_dir)
        {
            try
            {
                DirectoryInfo dir_inf = new DirectoryInfo(begin_dir);
                foreach (DirectoryInfo dir in dir_inf.GetDirectories())
                {
                    if (Directory.Exists(end_dir + "\\" + dir.Name) != true)
                    {
                        Directory.CreateDirectory(end_dir + "\\" + dir.Name);
                    }
                    UpdateDirectory(dir.FullName, end_dir + "\\" + dir.Name);
                }
                foreach (string file in Directory.GetFiles(begin_dir))
                {
                    string filik = file.Substring(file.LastIndexOf('\\'), file.Length - file.LastIndexOf('\\'));                   
                    File.Copy(file, end_dir + "\\" + filik, true);
                    Invoke((Action)delegate
                    {
                        progressBar1.Maximum = dir_inf.GetFiles("*.*", SearchOption.AllDirectories).Length;
                        progressBar1.Value = 0;
                    });
                    //bckWorker.ReportProgress(0, string.Format("Copying {0} to {1}\r\n", file.Length, file.Length));
for (int i = 0; i < file.Length; i++)
                    {
                        percentageProgress = (i + 1) * 100 / file.Length;
                        bckWorker.ReportProgress(percentageProgress);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }                
        private void bckWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                statusLabel.Text = (e.ProgressPercentage.ToString() + "%");
                progressBar1.Value = e.ProgressPercentage;
                percentageProgress = progressBar1.Value++;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void bckWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                settings = new SettingsDirectory();
                settings = settings.LoadFile();
                UpdateDirectory(settings.UpdateBeginDirectory, settings.UpdateEndDirectory);
                Process.Start(settings.LocalMainExe);
                Environment.Exit(0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void bckWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (e.Cancelled == true)
                {
                    statusLabel.Text = "Отменено!";
                }
                else if (e.Error != null)
                {
                    statusLabel.Text = "Ошибка: " + e.Error.Message;
                }
                else
                {
                    statusLabel.Text = "Выполнено!";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

Answer 1

Что-то я не вижу, что бы вы у своего bckWorker вызывали метод ReportProgress.

Как по вашему мнению он должен узнать, что случился какой-то прогресс и нужно репортовать?

В документации тут есть пример с прогрессом.

READ ALSO
Поиск файлов по расширению c#

Поиск файлов по расширению c#

такая проблема: Есть код, который получает все файлы с данным расширением

109
Время работы Math.Pow - const?

Время работы Math.Pow - const?

Есть 2 функции, находящие n-ное число ФибоначчиПервое находит через фор-лу Бине O(Log N), второе через метод итераций O(n)

130
Проблемы с бд C#

Проблемы с бд C#

Всем привет, суть проблемы то что я делаю "Регистрацию" для этого я делаю проверки что бы небыло одинаковых логинов делаю проверку:

101