Скачивание нескольких файлов по очереди DownloadFileTaskAsync - C#

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

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

На просторах форума нашёл несколько вариантов, доработав один из них получил:
  public async Task DownloadManyFiles(Dictionary<Uri, string> files)
        {
            WebClient wc = new WebClient();
            wc.DownloadProgressChanged += (s, e) => progressBar1.Value = e.ProgressPercentage;
            foreach (KeyValuePair<Uri, string> pair in files) { await wc.DownloadFileTaskAsync(pair.Key, pair.Value); await Task.Delay(2000); }
            wc.Dispose();
        }
 
        private void load()
        {
            string path = @"C:\jpg";
            Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
            for (int i = 0; i <= m.Length - 2; i++)
            {
                int x1 = 0;
                x1 = m[i].Length - 8;
                string ch1 = m[i].Substring(0, x1);
                string ch2 = Regex.Replace(m[i], ch1, "");
                ch1 = Regex.Replace(ch1, @"http://www.ib-gallery.ru", "");
                string subpath = ch1.Remove(0, 1);
                DirectoryInfo dirInfo = new DirectoryInfo(path);
                if (!dirInfo.Exists)
                {
                    dirInfo.Create();
                }
                dirInfo.CreateSubdirectory(subpath);
                string u = m[i];
                string name = Regex.Replace(subpath, @"/", @"");
                string p = path + @"" + name + ch2;
                richTextBox1.Text += "Путь:" + p + "\n";
                if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p); }
 
            }
 
            DownloadManyFiles(dict);
        }
      private void button1_Click(object sender, EventArgs e)
        {
            string value_A1, value;
            excelapp = new Excel.Application();
            excelapp.Visible = false;
            excelappworkbook = excelapp.Workbooks.Open(@"C:\\jpg\\_all.xlsx",
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);
            excelsheets = excelappworkbook.Worksheets;
            excelworksheet = (Excel.Worksheet)excelsheets.get_Item("лист1");
            for (int j = 2; j <= excelworksheet.UsedRange.Rows.Count; j++)
            {
                value = "G" + j;
                excelcells = excelworksheet.get_Range(value);
                value_A1 = excelcells.Text.ToString();
                if (value_A1 != "")
                {
                    richTextBox1.Text += value_A1 + "\n";
 
                }
            }
            for (int j = 2; j <= excelworksheet.UsedRange.Rows.Count; j++)
            {
                value = "H" + j;
 
                excelcells = excelworksheet.get_Range(value);
                value_A1 = excelcells.Text.ToString();
                if (value_A1 != "")
                {
                    richTextBox1.Text += value_A1 + "";
 
                }
            }
 
            m = new string[richTextBox1.Lines.Length];
            for (int j = 0; j <= richTextBox1.Lines.Length - 1; j++)
            {
                m[j] = richTextBox1.Lines[j];
            }
            int sheetscount = excelappworkbook.Sheets.Count; // подсчет количества листов
            excelworksheet = (Excel.Worksheet)excelappworkbook.Worksheets.get_Item(1);
            int lastRow = excelworksheet.UsedRange.Rows.Count; // подсчет количества строк на листе 1
            int lastColumn = excelworksheet.UsedRange.Columns.Count; // подсчет количества столбцов на листе 1
            excelapp.Application.Quit();
            object oExcel = Marshal.GetActiveObject("Excel.Application");
            Marshal.ReleaseComObject(oExcel);
            GC.GetTotalMemory(true);

            load();
 
        }
Но вот какая засада, сервер с которого качаю фото очень часто выдаёт ошибки(504 например) и получаю не все фото. То есть если во время закачки фото сервер выдал ошибку он начинает качать следующую пропустив фото... Вопрос: как такого избежать?
В общем в связи с ограничением по времени воткнул кастыль(проверяю существует ли файл и не весит ли он 0...После скачки всех файлов или если завис из за отказа сервера, запускаю ещё раз и докачиваю недостающие) Кому интересно:
        private void load()
        {
            string path = @"C:\jpg";
            Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
            for (int i = 0; i <= m.Length - 2; i++)
            {
                int x1 = 0;
                x1 = m[i].Length - 8;
                string ch1 = m[i].Substring(0, x1);
                string ch2 = Regex.Replace(m[i], ch1, "");
               // ch1 = Regex.Replace(ch1, @"http://www.ib-gallery.ru", "");
                string subpath = ch1.Remove(0, 1);
                DirectoryInfo dirInfo = new DirectoryInfo(path);
                if (!dirInfo.Exists)
                {
                    dirInfo.Create();
                }
                dirInfo.CreateSubdirectory(subpath);
                string u = "http://www.ib-gallery.ru"+m[i];
                string name = Regex.Replace(subpath, @"/", @"");
                string p = path + @"" + name + ch2;
                richTextBox1.Text += "Путь:" + p + "\n";
                if (System.IO.File.Exists(p))
                {
                    richTextBox1.Text += "Файл " + p + " существует\n";
                    FileInfo file = new FileInfo(p);
                    richTextBox1.Text += file.Length + "\n\n";
                    if (file.Length == 0) { if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p); kol_f++; } }
                }
                else
                {
                    if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p);kol_f++; }
                }
            }
 
            DownloadManyFiles(dict);
        }
Но хотел бы всё же получить ответ, ведь всё же не обработано исключение если файл не до качался и весит >0...

Решение задачи: «Скачивание нескольких файлов по очереди DownloadFileTaskAsync»

textual
Листинг программы
// Загрузить тайл с ресурса virtualearth
private void DownLoadTileFromHost(bool ok, string quadKey, string pthSave)
{
    lock (WorkerLocker)
    {
        string pthFile = GetPathTileHDD(DirNameTiles, DirNameVET, quadKey);
 
        // Если файл существует изменим прогрес бар в окне загрузки тайлов
        if(File.Exists(pthFile))
        {
            this.Invoke(new Action(() => { if (MarkingField != null) { FormLoadTiles.IncLoadTile(); }}));
        }
 
        // Если есть подключение
        if (ok)
        {
            // Запрос на получение тайла
            StringBuilder pth = new StringBuilder();
            pth.Append(@"http://ecn.t1.tiles.virtualearth.net/tiles/a");
            pth.Append(quadKey);
            pth.Append(@".jpeg?g=282&mkt=en-us");
            Uri url = new Uri(pth.ToString());
 
            using (WebClient wc = new WebClient())
            {
                wc.DownloadProgressChanged += wc_DownloadProgressChanged;
                wc.DownloadFileCompleted += wc_DownloadFileCompleted;
                wc.DownloadFileAsync(url, pthSave);
            }
        }
    }
}
 
// Процесс загрузки
private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    //this.Invoke(new Action(() =>
    //{
    //  if (progressBarDLT.Value == progressBarDLT.Maximum)
    //  {
    //      progressBarDLT.Value = progressBarDLT.Minimum;
    //  }
    //  progressBarDLT.Value = e.ProgressPercentage;
    //}));
}
 
// Успешная загрузка тайла
private void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    // Изменим прогрес бар в окне загрузки тайлов
    this.Invoke(new Action(() => { if (MarkingField != null) { FormLoadTiles.IncLoadTile(); } }));
 
    // Расчитаем tileX и tileY для верхнего левого угла view больше на размер view  (координаты в пликах)
    Point tileUpL = new Point((PosInMapPix.X - TileSide) / TileSide, (PosInMapPix.Y - TileSide) / TileSide);
 
    // Расчитаем tileX и tileY для нижнего правого угла view  больше на размер view (координаты в пликах)
    Point tileDownR = new Point((PosInMapPix.X + this.Size.Width + TileSide) / TileSide, (PosInMapPix.Y + this.Size.Height + TileSide) / TileSide);
 
    // Получение тайлов, котодые видны для просмотрщике 
    for (int i = tileUpL.X - 1; i <= tileDownR.X + 1; i++)
    {
        for (int j = tileUpL.Y - 1; j <= tileDownR.Y + 1; j++)
        {
            string qk = TileSystem.TileXYToQuadKey(i, j, MaplevelOfDetail);
            RefreshDraw(qk);
            //Invalidate();
        }
    }
}

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


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

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

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