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

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

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

На просторах форума нашёл несколько вариантов, доработав один из них получил:
Листинг программы
  1. public async Task DownloadManyFiles(Dictionary<Uri, string> files)
  2. {
  3. WebClient wc = new WebClient();
  4. wc.DownloadProgressChanged += (s, e) => progressBar1.Value = e.ProgressPercentage;
  5. foreach (KeyValuePair<Uri, string> pair in files) { await wc.DownloadFileTaskAsync(pair.Key, pair.Value); await Task.Delay(2000); }
  6. wc.Dispose();
  7. }
  8. private void load()
  9. {
  10. string path = @"C:\jpg";
  11. Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
  12. for (int i = 0; i <= m.Length - 2; i++)
  13. {
  14. int x1 = 0;
  15. x1 = m[i].Length - 8;
  16. string ch1 = m[i].Substring(0, x1);
  17. string ch2 = Regex.Replace(m[i], ch1, "");
  18. ch1 = Regex.Replace(ch1, @"http://www.ib-gallery.ru", "");
  19. string subpath = ch1.Remove(0, 1);
  20. DirectoryInfo dirInfo = new DirectoryInfo(path);
  21. if (!dirInfo.Exists)
  22. {
  23. dirInfo.Create();
  24. }
  25. dirInfo.CreateSubdirectory(subpath);
  26. string u = m[i];
  27. string name = Regex.Replace(subpath, @"/", @"");
  28. string p = path + @"" + name + ch2;
  29. richTextBox1.Text += "Путь:" + p + "\n";
  30. if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p); }
  31. }
  32. DownloadManyFiles(dict);
  33. }
  34. private void button1_Click(object sender, EventArgs e)
  35. {
  36. string value_A1, value;
  37. excelapp = new Excel.Application();
  38. excelapp.Visible = false;
  39. excelappworkbook = excelapp.Workbooks.Open(@"C:\\jpg\\_all.xlsx",
  40. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  41. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  42. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  43. Type.Missing, Type.Missing);
  44. excelsheets = excelappworkbook.Worksheets;
  45. excelworksheet = (Excel.Worksheet)excelsheets.get_Item("лист1");
  46. for (int j = 2; j <= excelworksheet.UsedRange.Rows.Count; j++)
  47. {
  48. value = "G" + j;
  49. excelcells = excelworksheet.get_Range(value);
  50. value_A1 = excelcells.Text.ToString();
  51. if (value_A1 != "")
  52. {
  53. richTextBox1.Text += value_A1 + "\n";
  54. }
  55. }
  56. for (int j = 2; j <= excelworksheet.UsedRange.Rows.Count; j++)
  57. {
  58. value = "H" + j;
  59. excelcells = excelworksheet.get_Range(value);
  60. value_A1 = excelcells.Text.ToString();
  61. if (value_A1 != "")
  62. {
  63. richTextBox1.Text += value_A1 + "";
  64. }
  65. }
  66. m = new string[richTextBox1.Lines.Length];
  67. for (int j = 0; j <= richTextBox1.Lines.Length - 1; j++)
  68. {
  69. m[j] = richTextBox1.Lines[j];
  70. }
  71. int sheetscount = excelappworkbook.Sheets.Count; // подсчет количества листов
  72. excelworksheet = (Excel.Worksheet)excelappworkbook.Worksheets.get_Item(1);
  73. int lastRow = excelworksheet.UsedRange.Rows.Count; // подсчет количества строк на листе 1
  74. int lastColumn = excelworksheet.UsedRange.Columns.Count; // подсчет количества столбцов на листе 1
  75. excelapp.Application.Quit();
  76. object oExcel = Marshal.GetActiveObject("Excel.Application");
  77. Marshal.ReleaseComObject(oExcel);
  78. GC.GetTotalMemory(true);
  79.  
  80. load();
  81. }
Но вот какая засада, сервер с которого качаю фото очень часто выдаёт ошибки(504 например) и получаю не все фото. То есть если во время закачки фото сервер выдал ошибку он начинает качать следующую пропустив фото... Вопрос: как такого избежать?
В общем в связи с ограничением по времени воткнул кастыль(проверяю существует ли файл и не весит ли он 0...После скачки всех файлов или если завис из за отказа сервера, запускаю ещё раз и докачиваю недостающие) Кому интересно:
Листинг программы
  1. private void load()
  2. {
  3. string path = @"C:\jpg";
  4. Dictionary<Uri, string> dict = new Dictionary<Uri, string>();
  5. for (int i = 0; i <= m.Length - 2; i++)
  6. {
  7. int x1 = 0;
  8. x1 = m[i].Length - 8;
  9. string ch1 = m[i].Substring(0, x1);
  10. string ch2 = Regex.Replace(m[i], ch1, "");
  11. // ch1 = Regex.Replace(ch1, @"http://www.ib-gallery.ru", "");
  12. string subpath = ch1.Remove(0, 1);
  13. DirectoryInfo dirInfo = new DirectoryInfo(path);
  14. if (!dirInfo.Exists)
  15. {
  16. dirInfo.Create();
  17. }
  18. dirInfo.CreateSubdirectory(subpath);
  19. string u = "http://www.ib-gallery.ru"+m[i];
  20. string name = Regex.Replace(subpath, @"/", @"");
  21. string p = path + @"" + name + ch2;
  22. richTextBox1.Text += "Путь:" + p + "\n";
  23. if (System.IO.File.Exists(p))
  24. {
  25. richTextBox1.Text += "Файл " + p + " существует\n";
  26. FileInfo file = new FileInfo(p);
  27. richTextBox1.Text += file.Length + "\n\n";
  28. if (file.Length == 0) { if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p); kol_f++; } }
  29. }
  30. else
  31. {
  32. if (dict.ContainsKey(new Uri(u))) { } else { dict.Add(new Uri(u), p);kol_f++; }
  33. }
  34. }
  35. DownloadManyFiles(dict);
  36. }
Но хотел бы всё же получить ответ, ведь всё же не обработано исключение если файл не до качался и весит >0...

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

textual
Листинг программы
  1. // Загрузить тайл с ресурса virtualearth
  2. private void DownLoadTileFromHost(bool ok, string quadKey, string pthSave)
  3. {
  4.     lock (WorkerLocker)
  5.     {
  6.         string pthFile = GetPathTileHDD(DirNameTiles, DirNameVET, quadKey);
  7.  
  8.         // Если файл существует изменим прогрес бар в окне загрузки тайлов
  9.         if(File.Exists(pthFile))
  10.         {
  11.             this.Invoke(new Action(() => { if (MarkingField != null) { FormLoadTiles.IncLoadTile(); }}));
  12.         }
  13.  
  14.         // Если есть подключение
  15.         if (ok)
  16.         {
  17.             // Запрос на получение тайла
  18.             StringBuilder pth = new StringBuilder();
  19.             pth.Append(@"http://ecn.t1.tiles.virtualearth.net/tiles/a");
  20.             pth.Append(quadKey);
  21.             pth.Append(@".jpeg?g=282&mkt=en-us");
  22.             Uri url = new Uri(pth.ToString());
  23.  
  24.             using (WebClient wc = new WebClient())
  25.             {
  26.                 wc.DownloadProgressChanged += wc_DownloadProgressChanged;
  27.                 wc.DownloadFileCompleted += wc_DownloadFileCompleted;
  28.                 wc.DownloadFileAsync(url, pthSave);
  29.             }
  30.         }
  31.     }
  32. }
  33.  
  34. // Процесс загрузки
  35. private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  36. {
  37.     //this.Invoke(new Action(() =>
  38.     //{
  39.     //  if (progressBarDLT.Value == progressBarDLT.Maximum)
  40.     //  {
  41.     //      progressBarDLT.Value = progressBarDLT.Minimum;
  42.     //  }
  43.     //  progressBarDLT.Value = e.ProgressPercentage;
  44.     //}));
  45. }
  46.  
  47. // Успешная загрузка тайла
  48. private void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
  49. {
  50.     // Изменим прогрес бар в окне загрузки тайлов
  51.     this.Invoke(new Action(() => { if (MarkingField != null) { FormLoadTiles.IncLoadTile(); } }));
  52.  
  53.     // Расчитаем tileX и tileY для верхнего левого угла view больше на размер view  (координаты в пликах)
  54.     Point tileUpL = new Point((PosInMapPix.X - TileSide) / TileSide, (PosInMapPix.Y - TileSide) / TileSide);
  55.  
  56.     // Расчитаем tileX и tileY для нижнего правого угла view  больше на размер view (координаты в пликах)
  57.     Point tileDownR = new Point((PosInMapPix.X + this.Size.Width + TileSide) / TileSide, (PosInMapPix.Y + this.Size.Height + TileSide) / TileSide);
  58.  
  59.     // Получение тайлов, котодые видны для просмотрщике
  60.     for (int i = tileUpL.X - 1; i <= tileDownR.X + 1; i++)
  61.     {
  62.         for (int j = tileUpL.Y - 1; j <= tileDownR.Y + 1; j++)
  63.         {
  64.             string qk = TileSystem.TileXYToQuadKey(i, j, MaplevelOfDetail);
  65.             RefreshDraw(qk);
  66.             //Invalidate();
  67.         }
  68.     }
  69. }

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


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

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

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы