Доброго времени суток.
Подскажите пожалуйста, как переделать метод скачивания, и добавить адекватные кнопки паузы скачивания, возобновления, и resume?
Ибо мне заказ выполнили, а после оплаты, я посмотрел, а тут всё совершенно не так как я планировал, и заказывал, возможно тут найдутся люди, которые помогут, сделают...
По сути дела, всё конечно работает, но, нет кнопки паузы скачивания, нет возобновлений скачиваний.
Скорость пишется в байтах(это уже я просмотрел когда платил деньги)
Если кто сможет взяться за переделку данного "ЧУДА" даже и не бесплатно, оставьте пожалуйста свои контакты, только очень прошу, не почту, я обязательно Вам напишу...
public class Downloader
{
private readonly string master_url;
private readonly IDownloadProvider downloadProvider;
private long currentDownloadedSize;
private long prevDownloadedSize;
private double speed;
private Stopwatch stopwatch = new Stopwatch();
/// <summary>
/// Представляет функциональность для закачки файлов
/// </summary>
/// <param name="MasterUrl">Ссылка, откуда будут скачиваться файлы.</param>
/// <param name="provider">Провайдер для загрузки.</param>
/// <param name="ntds">Необходимый размер закачки.</param>
public Downloader(string MasterUrl, IDownloadProvider provider, long ntds)
{
master_url = MasterUrl;
downloadProvider = provider;
currentDownloadedSize = ntds;
}
/// <summary>
/// Функционал загрузки файлов
/// </summary>
/// <param name="path">Абсолютный путь, куда файлы будут сохраняться</param>
/// <param name="progressChanged">Событие, вызывающееся при изменении прогресса (при подключении прогрессбара указать)</param>
/// <param name="completed">Событие, вызывающиеся при завершении закачки (при подключении прогрессбара указать)</param>
public async Task DownloadFiles(string path)
{
using (WebClient wc = new WebClient())
{
wc.DownloadProgressChanged += Wc_DownloadProgressChanged;
foreach (var fileName in downloadProvider.Files)
{
CreateNeccessaryDirs(path + @"\" + fileName.Value);
if (File.Exists(path + @"\" + fileName.Value))
{
continue;
}
prevDownloadedSize = 0L;
StartDownload?.Invoke(this, new StartDownloadFileArgs { FileName = fileName.Value });
stopwatch.Restart();
await wc.DownloadFileTaskAsync(new Uri(master_url + "/" + fileName.Key), path + @"\" + fileName.Value);
stopwatch.Stop();
}
ProgressChanged?.Invoke(this, new Events.DownloadProgressChangedEventArgs() { NewPercentage = 100 });
}
}
private void Wc_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
if (prevDownloadedSize == 0)
{
prevDownloadedSize = e.BytesReceived / 1024;
}
if (stopwatch.Elapsed.TotalSeconds >= 1)
{
var dKBytes = (e.BytesReceived / 1024) - prevDownloadedSize;
currentDownloadedSize += dKBytes;
speed = dKBytes / stopwatch.Elapsed.TotalSeconds;
prevDownloadedSize = 0L;
OnProgressChanged();
stopwatch.Restart();
}
}
private void CreateNeccessaryDirs(string fileName)
{
var idx = fileName.LastIndexOf("\\");
fileName = fileName.Remove(idx);
Directory.CreateDirectory(fileName);
}
private int GetPercentage() => (int)Math.Round((currentDownloadedSize / (float)downloadProvider.Size) * 100);
private void OnProgressChanged()
{
Events.DownloadProgressChangedEventArgs eventInfo;
eventInfo = new Events.DownloadProgressChangedEventArgs() { NewPercentage = GetPercentage(),
Speed = Math.Round(speed), DownloadedSize = currentDownloadedSize, AllSize = downloadProvider.Size };
ProgressChanged?.Invoke(this, eventInfo);
}
public event DownloadProgressChanged ProgressChanged;
public event StartDownloadEvent StartDownload;
}