Загрузка по списку нескольких файлов с веб-сервера - C#

Узнай цену своей работы

Формулировка задачи:

При разработе приложения возникла необходимость загрузить по списку несколько файлов с https- вебсервера. Как сделать загрузку нового файла, только после финиша предыдущего, в данный момент загрузка происходит всех выбранных файлов одновременно, а прогресбар начинает дергаться, сбрасываться, если загружать 1 файл, то прогресбар работает отлично. Я использую checkedListBox, в будущем ссылок на файлы будет очень много, если есть способ решения укоротить код или какой нибудь другой способ, всегда буду рад вашему примеру Тестовый проект прикрепил, а вот весь код проекта:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Diagnostics;
 
namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult result = folderBrowserDialog1.ShowDialog();
            textBox1.Text = folderBrowserDialog1.SelectedPath;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked)
            {
                string link = @"http://support.satgate.net/dl_test/dl/5MB.bin"; //ссылка
                string downloadFileName = Path.GetFileName("5MB.bin"); //Имя файла
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(link), folderBrowserDialog1.SelectedPath + "" + downloadFileName); //название и можно путь провести, если папки не существует то ее надо создать заранее
 
            }
            if (checkedListBox1.GetItemCheckState(1) == CheckState.Checked)
            {
                string link = @"http://support.satgate.net/dl_test/dl/10MB.bin"; 
                string downloadFileName = Path.GetFileName("10MB.bin");
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(link), folderBrowserDialog1.SelectedPath + "" + downloadFileName); 
            }
            if (checkedListBox1.GetItemCheckState(2) == CheckState.Checked)
            {
                string link = @"http://support.satgate.net/dl_test/dl/50MB.bin";
                string downloadFileName = Path.GetFileName("50MB.bin");
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(link), folderBrowserDialog1.SelectedPath + "" + downloadFileName);
            }
 
            if (checkedListBox1.GetItemCheckState(3) == CheckState.Checked)
            {
                string link = @"http://support.satgate.net/dl_test/dl/100MB.bin";
                string downloadFileName = Path.GetFileName("100MB.bin");
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(link), folderBrowserDialog1.SelectedPath + "" + downloadFileName);
            }
 
        }
 
        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
 
        // The event that will trigger when the WebClient is completed
        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                string error = e.Error.ToString();
                // or
                // error = "Your error message here";
 
                MessageBox.Show(error);
                return;
            }
            if (e.Cancelled == true)
            {
                MessageBox.Show("Download has been canceled.");
            }
            else
            {
                MessageBox.Show("Download completed!");
            }
        }
    }
}
Находил пару тем по смыслу, но не смог разобраться в них, так как опыта с программированием не так много.

Решение задачи: «Загрузка по списку нескольких файлов с веб-сервера»

textual
Листинг программы
// Получить список файлов с вэб-сервера
public static string[] GetHttpFiles(string url)
{
    List<string> files = new List<string>(10000);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            string html = reader.ReadToEnd();
            Regex regex = new Regex("<a href=".*">(?<name>.*)</a>");
            MatchCollection matches = regex.Matches(html);
            if (matches.Count > 0)
            {
                // ReSharper disable once LoopCanBeConvertedToQuery
                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        //string[] matchData = match.Groups[0].ToString().Split('"');
                        //files.Add(matchData[1]);
                        files.Add(Convert.ToString(match.Groups["name"]));
                    }
                }
            }
        }
    }
    return files.ToArray();
}
 
private void buttonGetFileList_Click(object sender, EventArgs e)
{
    checklistFiles.Items.Clear();
    foreach (var line in GetHttpFiles(textBoxHttp.Text))
    {
        if ((line.ToLower() != "description") && (line.ToLower() != "parent directory"))
        {
            checklistFiles.Items.Add(line, true);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы