Почему при загрузке файлов с помощью веб-клиента downloadfileasyn c я получаю исключение для значения progressBar, которое является отрицательным значением? - PullRequest
0 голосов
/ 02 апреля 2020
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;

namespace DownloadFilesFromSite
{
    public partial class Form1 : Form
    {
        private Queue<string> _downloadUrls = new Queue<string>();
        private List<string> urls = new List<string>();
        private List<string> sources = new List<string>();
        private List<string> links = new List<string>();

        public Form1()
        {
            InitializeComponent();

            Sources();
        }

        private void Sources()
        {
            string link = "https://www.documentingreality.com/forum/f10/several-different-dead-chinese-women-176102/";

            for (int i = 2; i < 141; i++)
            {
                sources.Add(link + "index" + i + ".html");
            }
        }

        private void ReadSourcePage(string fn)
        {
            var lines = File.ReadAllLines(fn).ToList();

            string contains = "https://www.documentingreality.com/forum/attachments/f10/";

            for (int i = 0; i < lines.Count; i++)
            {
                if (lines[i].Contains(contains))
                {
                    int index = lines[i].IndexOf("f10/") + 4;
                    int index1 = lines[i].IndexOf(".jpg") - index;
                    string result = lines[i].Substring(index, index1);

                    links.Add(contains + result + ".jpg");
                }
            }
        }

        private void downloadFiles(IEnumerable<string> urls)
        {
            foreach (var url in urls)
            {
                _downloadUrls.Enqueue(url);
            }

            // Starts the download
            button1.Text = "Downloading...";
            button1.Enabled = false;
            progressBar1.Visible = true;
            label1.Visible = true;

            DownloadFile();
        }

        private void DownloadFile()
        {
            if (_downloadUrls.Any())
            {
                WebClient client = new WebClient();
                client.Headers.Add("User-Agent: Other");
                client.DownloadProgressChanged += client_DownloadProgressChanged;
                client.DownloadFileCompleted += client_DownloadFileCompleted;

                var url = _downloadUrls.Dequeue();
                string FileName = url.Substring(url.LastIndexOf("/") + 1,
                            (url.Length - url.LastIndexOf("/") - 1));

                client.DownloadFileAsync(new Uri(url), @"E:\dr\htmlsources\" + FileName);
                label1.Text = url;
                return;
            }

            // End of the download
            button1.Text = "Download Complete";
        }

        private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // handle error scenario
                throw e.Error;
            }
            if (e.Cancelled)
            {
                // handle cancelled scenario
            }
            DownloadFile();
        }

        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            double bytesIn = double.Parse(e.BytesReceived.ToString());
            double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
            double percentage = bytesIn / totalBytes * 100;
            progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            downloadFiles(sources);
        }
    }
}

В файле загрузки на строчке:

client.DownloadFileAsync(new Uri(url), @"E:\dr\htmlsources\" + FileName);

Если я скопирую адрес URL в chrome, он покажет мне источник страницы, и я смогу сохранить и загрузить источник страница будет иметь размер около 700 КБ

Но при нажатии кнопки 1 при начале загрузки этих источников будет выдано исключение:

ArgumentOutOfRangeException: значение -154300 недопустимо для значения. «Значение» должно быть между «минимальным» и «максимальным». Имя параметра: Значение

И если я вообще не буду использовать progressBar1 для тестирования всех загруженных исходных файлов, то будет около 25 КБ, а не около 700 КБ.

Я попытался добавить строку:

client.Headers.Add("User-Agent: Other");

Но, похоже, не исправить исключение.

1 Ответ

0 голосов
/ 02 апреля 2020

DownloadFileAsync немедленно вернется, а затем «клиент» также go выйдет из области видимости. Узнайте, как использовать функции async / await.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...