Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - С# Загрузка файла с отображением процесса загрузки

Ответить
Настройки темы
.NET - С# Загрузка файла с отображением процесса загрузки

Новый участник


Сообщения: 45
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день.

С#, Net Framework 4.5
Хочу создать консольное приложение которое загрузит файл с отображением процесса загрузки.

Код: Выделить весь код
using System;
using System.ComponentModel;
using System.IO;
using System.Net;

public class Program
{
    public static void Main()
    {
        new Program().Download("https://github.com/deemru/Chromium-Gost/releases/download/121.0.6167.85/chromium-gost-121.0.6167.85-windows-386.zip");
    }
    public void Download(string remoteUri)
    {
        string FilePath = Directory.GetCurrentDirectory() + "/temp/" + Path.GetFileName(remoteUri);
        using (WebClient client = new WebClient())
        {
            if (!Directory.Exists("temp"))
            {
                Directory.CreateDirectory("temp");
            }
            Uri uri = new Uri(remoteUri);
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(Extract);
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgessChanged);
            client.DownloadFileAsync(uri, FilePath);
        }
    }
    public void Extract(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("File has been downloaded.");
    }
    public void ProgessChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine($"Download status: {e.ProgressPercentage}%.");
    }
}
Но загрузка не происходит. Ошибок не дает. Создает папку темп, в ней название целевого файла с весом 0 байт и закрывается.
В таком виде работает, но хотелось бы отображение процесса загрузки.

Код: Выделить весь код
using System;
using System.Net;

namespace test
{
    internal class Program
    {
        static void Main1(string[] args)
        {
            string URI = "https://github.com/deemru/Chromium-Gost/releases/download/121.0.6167.85/chromium-gost-121.0.6167.85-windows-386.zip";
            using (var client = new WebClient())
            {
                //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                client.DownloadFile(URI , "chromium-gost-121.0.6167.85-windows-386.zip");
            }
            Console.WriteLine("Готово");
            Console.ReadKey();
        }
    }
}
Подскажите, что не так с первым кодом?

Отправлено: 00:50, 31-01-2024

 

Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


Цитата nwss:
client.DownloadFileAsync(uri, FilePath); »
видимо не блокирует и сразу после неё вызывается client.Dispose(). Во втором как раз DownloadFile не асинхронный.

Отправлено: 08:35, 31-01-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 45
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Sham:
client.Dispose() »
а с чего он вызывается-то?

то что не асинхронный работает я понимаю, но мне хочется отображение процесса загрузки.
пока что сделал вот такое убожество, но выглядит не так красиво, как хотелось бы.
Код: Выделить весь код
using System;
using System.IO;
using System.Net;

namespace test
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string URI = "https://github.com/deemru/Chromium-Gost/releases/download/121.0.6167.85/chromium-gost-121.0.6167.85-windows-386.zip";
            using (var client = new WebClient())
            {
                //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                client.DownloadFileAsync(new Uri(URI), "chromium-gost-121.0.6167.85-windows-386.zip");
                while (client.IsBusy) 
                {
                    long length = new FileInfo("chromium-gost-121.0.6167.85-windows-386.zip").Length;
                    Console.Clear();
                    Console.WriteLine("Еще качаем \"{0}\" Мбайт", length / 1024 / 1024); 
                    System.Threading.Thread.Sleep(100);
                }
            }
            Console.WriteLine("Готово");
            Console.ReadKey();
        }
    }
}

Отправлено: 18:37, 31-01-2024 | #3


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


хотя сам WebClient и не IDisposable, но наследует от такого (Component). Для чего тогда using(){}?
Цитата nwss:
while (client.IsBusy) »
гляньте в сторону DownloadFileTaskAsync - он возвращает Task, на котором можно .wait().

Отправлено: 19:42, 31-01-2024 | #4


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


у меня этот вариант нормально отработал (компилировал под .net framework в win10)
Код: Выделить весь код
using System;
using System.ComponentModel;
using System.IO;
using System.Net;

public class Program
{
    public static void Main()
    {
        new Program().Download("https://github.com/deemru/Chromium-Gost/releases/download/121.0.6167.85/chromium-gost-121.0.6167.85-windows-386.zip");
    }
    public void Download(string remoteUri)
    {
        string FilePath = Directory.GetCurrentDirectory() + "/temp/" + Path.GetFileName(remoteUri);
        using (WebClient client = new WebClient())
        {
            if (!Directory.Exists("temp"))
            {
                Directory.CreateDirectory("temp");
            }
            Uri uri = new Uri(remoteUri);
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(Extract);
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgessChanged);
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            client.DownloadFileTaskAsync(uri, FilePath).Wait();
        }
    }
    public void Extract(object sender, AsyncCompletedEventArgs e)
    {
        Console.Write("\nFile has been downloaded.\n");
    }
    public void ProgessChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.Write("\rDownload status: " + e.ProgressPercentage + "%.");
    }
}

Отправлено: 20:04, 31-01-2024 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - С# Загрузка файла с отображением процесса загрузки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Проблема с отображением папки сохранения файла Kluk Microsoft Windows 10 9 24-06-2016 14:38
CMD/BAT - [решено] Бар загрузки или выполнения процесса в bat cmd DJIOAN Скриптовые языки администрирования Windows 4 25-08-2015 00:36
[решено] открытие файла при закрытии процесса Freaxxx AutoIt 2 08-07-2012 21:14
Загрузка - зацикливание начального процесса загрузки WChek Microsoft Windows 2000/XP 10 08-07-2008 02:20
Debian/Ubuntu - Ubuntu не видно процесса загрузки. xden777 Общий по Linux 13 07-01-2008 17:46




 
Переход