Вывод процесса загрузки файла из интернета на консоль - C#
Формулировка задачи:
Доброго времени суток. Не могу найти как правильно выводить процесс загрузки на консоль.
Нужно загрузить файл, что то вроде этого:
Как видоизменить код что бы отображалась загрузка в процентах.
В книге братьев Албахари нашел такой код. Но никак реализовать его грамотно не выходит, процесс загрузки тупо не отображается.
Подскажите правильную реализацию, или по крайней мере в какую сторону копать нужно. Спс.
WebClient wc = new WebClient();
wc.Proxy = null;
wc.DownloadFile("http://.....", "file.mp4");var wc = new WebClient();
wc.DownloadProgressChanged += (sender, args) =>
Console.WriteLine (args.ProgressPercentage + "% complete");
Task.Delay (5000).ContinueWith (ant => wc.CancelAsync());
await wc.DownloadFileTaskAsync ("http://.....", "file.mp4");Решение задачи: «Вывод процесса загрузки файла из интернета на консоль»
textual
Листинг программы
static readonly object sync = new object();
static readonly ConsoleColor[] Gradient =
{
ConsoleColor.Red,
ConsoleColor.DarkYellow,
ConsoleColor.Yellow,
ConsoleColor.DarkGreen,
ConsoleColor.Green
};
static readonly string[] Suffixes =
{
"B",
"KB",
"MB",
"TB"
};
static void Main(string[] args)
{
var http = new WebClient();
http.DownloadProgressChanged += ProgressCallback;
http.DownloadFileCompleted += CompletedCallback;
Console.CursorVisible = false;
Console.WriteLine("Downloading ... ");
http.DownloadFileTaskAsync("http://video.ch9.ms/ch9/92c6/15fdfbaa-2f86-490e-9f3e-6f8e5c8192c6/20150529TWC9_mid.mp4", @"d:\20150529TWC9_mid.mp4").Wait();
Console.ReadLine();
}
private static void CompletedCallback(object sender, AsyncCompletedEventArgs e)
{
Console.SetCursorPosition(0, Console.CursorTop + 1);
Console.ResetColor();
Console.WriteLine("Done!");
}
private static void ProgressCallback(object sender, DownloadProgressChangedEventArgs e)
{
var color = Gradient[(int)(e.ProgressPercentage / 100.0 * (Gradient.Length - 1))];
var progress = string.Format("|{0,-30}| {1,3}% {2,9} / {3,-9}",
new string((char)0x2592, e.ProgressPercentage * 30 / 100),
e.ProgressPercentage,
FormatSize(e.BytesReceived),
FormatSize(e.TotalBytesToReceive));
lock (sync)
{
Console.SetCursorPosition(0, 1);
Console.ForegroundColor = color;
Console.Write(progress);
}
}
static string FormatSize(double size)
{
int grade = (int)Math.Log(size, 1024);
grade = Math.Min(grade, Suffixes.Length);
return string.Format("{0:N2}{1}", size / Math.Pow(1024, grade), Suffixes[grade]);
}