У меня небольшая программка, которая копирует файлы с папками с одного места в указанное. Хотелось бы прикрутить 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);
}
}
}
Что-то я не вижу, что бы вы у своего bckWorker вызывали метод ReportProgress
.
Как по вашему мнению он должен узнать, что случился какой-то прогресс и нужно репортовать?
В документации тут есть пример с прогрессом.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
такая проблема: Есть код, который получает все файлы с данным расширением
Есть 2 функции, находящие n-ное число ФибоначчиПервое находит через фор-лу Бине O(Log N), второе через метод итераций O(n)
Всем привет, суть проблемы то что я делаю "Регистрацию" для этого я делаю проверки что бы небыло одинаковых логинов делаю проверку:
Постоянно сталкиваюсь с ошибкой :