DownloadFileAsync: несколько файлов - PullRequest
0 голосов
/ 19 июня 2011

Я столкнулся с некоторыми проблемами при использовании 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 ]

0 голосов
/ 19 июня 2011

Для выполнения индикатора выполнения вы можете использовать очередь. После завершения загрузки обновите индикатор выполнения и начните следующую загрузку. Однако я не думаю, что класс WebClient может сказать вам, сколько загрузки завершено, только если она закончена или нет.

Чтобы проверить, существует ли каталог, используйте:

if (!System.IO.Directory.Exists(folder_name)) System.IO.Directory.Create(folder_name);

Вы можете получить каталог по пути, используя класс System.IO.Path.

0 голосов
/ 19 июня 2011

Чтобы получить общий счетчик прогресса для вас, вам понадобится централизованная процедура, которая собирает завершенную на текущий момент сумму и общую сумму для загрузки для каждой выполняемой передачи и суммирует их для вычисления общих итогов , Поскольку передачи выполняются параллельно, вы не можете просто назначить часть индикатора выполнения (например, 51-100%) для каждого файла.

В большинстве API вам нужно создавать папки для себя, прежде чем записывать в них файлы. Просто сделайте это, чтобы создать все отсутствующие папки на пути перед началом записи файла:

Directory.CreateDirectory(Path.GetDirectoryName(filename));
...