Скачивание нескольких файлов по очереди 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д