Скачивание нескольких файлов по очереди DownloadFileTaskAsync - C#
Формулировка задачи:
На просторах форума нашёл несколько вариантов, доработав один из них получил:
Но вот какая засада, сервер с которого качаю фото очень часто выдаёт ошибки(504 например) и получаю не все фото. То есть если во время закачки фото сервер выдал ошибку он начинает качать следующую пропустив фото...
Вопрос: как такого избежать?
Но хотел бы всё же получить ответ, ведь всё же не обработано исключение если файл не до качался и весит >0...
Листинг программы
- 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();
- }
В общем в связи с ограничением по времени воткнул кастыль(проверяю существует ли файл и не весит ли он 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);
- }
Решение задачи: «Скачивание нескольких файлов по очереди 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д