Скачивание нескольких файлов по очереди 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();
}
}
}