На самом деле задача на половину выполнена, я имею готовое решение не без помощи backgoundWorker:
Функция копирования:
private void copy_file(string source_, string des)
{
FileStream fsOut = new FileStream(des, FileMode.Create);
FileStream fsIn = new FileStream(source_, FileMode.Open);
byte[] bt = new byte[1048756];
int readByte;
while ((readByte = fsIn.Read(bt, 0, bt.Length)) > 0)
{
fsOut.Write(bt, 0, readByte);
backgroundWorker1.ReportProgress((int)(fsIn.Position * 100 / fsIn.Length));
}
fsIn.Close();
fsOut.Close();
}
DoWork:
private void Worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
copy_file(server_path + filename, Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + filename);
}
RunWorkerCompleted:
private void Worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
err_msg.Text = "Файл находится на рабочем столе!";
}
else
{
err_msg.Text = "Произошла ошибка.";
}
download_sound.Enabled = true;
}
ProgressChanged:
private void Worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
err_msg.Text = progressBar1.Value.ToString() + "%";
}
Click Button:
Worker.RunWorkerAsync();
Выше указанный метод отлично справляется, но при использовании этого метода в Асинхронных функциях(например private async void button_click()), я получаю эффект очередности потоков, эм... файл копируется - помещается в нужную папку - прогресс бар мгновенно заполняется. Пробовал копировать через сеть, та же беда. Но к счастью работает когда async у btn отсутствует.
Теперь к сути:
Т.к. изначально мой план был использовать async\await методы, я перешел к такому виду копирования файлов:
public async Task CopyFilesAsync(StreamReader Source, StreamWriter Destination)
{
char[] buffer = new char[0x1000];
int numRead;
while ((numRead = await Source.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
await Destination.WriteAsync(buffer, 0, numRead);
}
}
_
public async Task CopyFile(string startDirectoy, string endDirectory)
{
using (StreamReader SourceReader = File.OpenText(startDirectoy))
{
using (StreamWriter DestinationWriter = File.CreateText(endDirectory))
{
await CopyFilesAsync(SourceReader, DestinationWriter);
SourceReader.Close();
DestinationWriter.Close();
}
}
}
Никак не могу сообразить каким образом мне заставить progressBar выполнять мою задачу. Я так же не могу достучаться до StreamReader.Position использовать:
progressBar1.Value=(int)((StreamReader.BaseStream.Position/StreamReader.BaseStream.Length)*100);
у меня не вышло. ProgressBar работал у меня отдельно от всего >< Если есть пару советов, прошу их дать, буду очень благодарен!
