DownloadFileAsync: несколько файлов
Я столкнулся с некоторыми проблемами при использовании C# WebClient DownloadFileAsync и надеюсь, что вы мне поможете.
Вот мой сценарий:
Я одновременно загружаю много файлов (http://example.com/abc/1.jpg, http://example.com/abc/efg/2.jpg и т. Д.), Используя WebClient DownloadFileAsync.
Мой текущий пример кода:
while (theres still files in http://example.com/abc/) {
// filename will be something like /abc/1.jpg, /abc/efg/2.jpg
if (!file.exists(directory.getcurrentdirectory()+filename.Replace('/', '\\'))) {
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloadProgressChanged);
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(downloadCompleted);
webClient.DownloadFileAsync(new Uri("http://example.com"+filename), Directory.GetCurrentDirectory()+filename.Replace('/', '\\'));
}
Как сделать так, чтобы все загружаемые файлы отображались в одном индикаторе прогресса?
например. 1.jpg - 50 КБ, 2.jpg - 50 КБ, когда 1.jpg завершит загрузку, индикатор выполнения покажет 50%, а 2.jpg - от 51% до 100% в индикаторе выполнения.
Также, если имя файла /abc/1.jpg, если в моем текущем каталоге нет папки с именем abc, загрузка не будет работать. Как мне сделать так, чтобы папка создавалась автоматически в зависимости от имени файла? (например, /random123/3.jpg, /anotherrandom/4.jpg и т. д.)
2 ответа
Для выполнения индикатора выполнения вы можете использовать очередь. После завершения загрузки обновите индикатор выполнения и начните следующую загрузку. Тем не менее, я не думаю, что класс WebClient может сказать вам, сколько загрузки завершено, только если она закончена или нет.
Чтобы проверить, существует ли каталог, используйте:
if (!System.IO.Directory.Exists(folder_name)) System.IO.Directory.Create(folder_name);
Вы можете получить каталог по пути, используя класс System.IO.Path.
Чтобы получить общий счетчик прогресса для вас, вам потребуется централизованная процедура, которая собирает завершенную на текущий момент сумму и общую сумму для загрузки для каждой выполняемой передачи и суммирует их для расчета общих итогов. Поскольку передачи выполняются параллельно, вы не можете просто назначить часть индикатора выполнения (например, 51-100%) для каждого файла.
С большинством API вам нужно создавать папки для себя, прежде чем записывать в них файлы. Просто сделайте это, чтобы создать все отсутствующие папки на пути перед началом записи файла:
Directory.CreateDirectory(Path.GetDirectoryName(filename));