Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 23

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

29.01.2017, 17:21. Показов 2502. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На просторах форума нашёл несколько вариантов, доработав один из них получил:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  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 например) и получаю не все фото. То есть если во время закачки фото сервер выдал ошибку он начинает качать следующую пропустив фото...
Вопрос: как такого избежать?

Добавлено через 4 часа 59 минут
В общем в связи с ограничением по времени воткнул кастыль(проверяю существует ли файл и не весит ли он 0...После скачки всех файлов или если завис из за отказа сервера, запускаю ещё раз и докачиваю недостающие)
Кому интересно:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        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...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2017, 17:21
Ответы с готовыми решениями:

Скачивание файлов по очереди с прогресс баром
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но суть в другом. Мне надо по очереди их...

Скачивание нескольких файлов по очереди WebClient
Здравствуйте, передо мной стояла задача скачать около 2000 файлов по ссылкам. Я заранее подготовил файл вида: &quot;ссылка |...

Скачивание нескольких файлов
Доброго времени суток!!! Нужно скачать по очереди несколько файлов по http, как это реализовать?

1
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
30.01.2017, 02:43
Лучший ответ Сообщение было отмечено Antoniy_ как решение

Решение

Вот вам пример 100% рабочий.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Загрузить тайл с ресурса 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();
        }
    }
}

Вам интересны строки с 24 по 28. Подписываемся на события DownloadProgressChanged и DownloadFileCompleted

А вот читаем https://msdn.microsoft.com/ru-... .110).aspx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.01.2017, 02:43
Помогаю со студенческими работами здесь

Скачивание нескольких файлов с отображением в ProgressBar
Доброго времени суток! Проблема такова: У меня есть код, который при нажатии на кнопку скачивает с сервера несколько файлов, так вот при...

Пакетное скачивание нескольких папок с сервера по очереди
Не могу правильно сформулировать вопрос. Значится так: Имеется скачивальщик POPOLN.CMD. Чтобы выкачать папку с сервера надо в командной...

Скачивание нескольких файлов
Сейчас моя задача в том чтобы создать функцию загрузки файлов по списку с отображением в прогресс бар, и далее обрабатывать эти файлы. Вот...

Скачивание нескольких файлов в архиве и их распаковка
Приветствую. Мне нужно было скачать несколько файлов, чтобы не качать по отдельности я решил запаковать в архив, а после скачки...

Асинхронное скачивание нескольких файлов с отображением прогресса
Уже несколько вечеров не могу устроить себе &quot;поочередное скачивание от 1 до 4 файлов с отображением прогресса&quot;, пробовал реализвоать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru