WebClient.DownloadFileAsync и потеря данных (скачивание картинок с сервера) - C#
Формулировка задачи:
Сохраняю картинки с сервера этим способом, их от 100 до 300. Скачивается быстро, все хорошо, но некоторые файлы после завершения работы остаются пустыми..от чего это происходит и как с этим бороться ? Видимо они не успевают записаться на диск...т.к. на ssd "битых" меньше, чем на usb hdd. Очень эта проблема настораживает.
Правда, еслждать неопределенно долго - то и асинхронный метод все загружает...
UrlList.txt - некий файл с построчными прямыми ссылками.
Листинг программы
- private void DownloadPhoto()
- {
- string tmp = null;
- string[] Urlparse = System.IO.File.ReadAllLines(pathString + "\\UrlList.txt");
- string[] UrlList = System.IO.File.ReadAllLines(pathString + "\\UrlList.txt");
- if (CountItemsTextEvent != null)
- CountItemsTextEvent(this, new ProcessEventArgs("Всего изображений: " + UrlList.Count()));
- for(int i = 0; i < UrlList.Count(); i++)
- {
- if (ProcessingLTextEvent != null)
- ProcessingLTextEvent(this, new ProcessEventArgs("Обработанно: " + (i + 1) + " (" + Math.Round(((Convert.ToDouble((i + 1)) / Convert.ToDouble(UrlList.Count())) * 100), 2) + "%)"));
- using (WebClient client = new WebClient())
- {
- Urlparse[i] = null;
- //System.Threading.Thread.Sleep(0300);
- client.DownloadFileAsync(new Uri(UrlList[i]), pathString + UrlList[i].Substring(UrlList[i].LastIndexOf('/')));
- Urlparse[i] = UrlList[i].Substring(UrlList[i].LastIndexOf('/'));
- Urlparse[i] = Urlparse[i].TrimStart('/');
- }
- }
- //System.Threading.Thread.Sleep(10000);
- if (StatusTextEvent != null)
- StatusTextEvent(this, new ProcessEventArgs("Статус: Перезагрузка изображений"));
- var dir = new DirectoryInfo(pathString);// папка с файлами
- foreach (FileInfo file in dir.GetFiles()) // извлекаем все файлы и кидаем их в список
- {
- FileInfo someFileInfo = new FileInfo(file.FullName);
- long fileByteSize = someFileInfo.Length;
- if (fileByteSize == 0)
- {
- for (int i = 0; i < Urlparse.Count(); i++)
- {
- if (CountItemsTextEvent != null)
- CountItemsTextEvent(this, new ProcessEventArgs("Всего изображений: " + i));
- if(file.Name == Urlparse[i])
- { using (WebClient client = new WebClient())
- {
- int c = 1;
- tmp = UrlList[i].Substring(UrlList[i].LastIndexOf('/'));
- tmp = tmp.TrimStart('/');
- client.DownloadFile(new Uri(UrlList[i]), pathString+"\\img\\"+tmp);
- if (ProcessingLTextEvent != null)
- ProcessingLTextEvent(this, new ProcessEventArgs("Обработанно: " + (c + 1) + " (" + Math.Round(((Convert.ToDouble((c + 1)) / Convert.ToDouble(i)) * 100), 2) + "%)"));
- }
- }
- }
- }
- }
- var dir_ = new DirectoryInfo(pathString+"\\img");
- foreach (FileInfo file in dir.GetFiles())
- {
- if (System.IO.File.Exists(pathString + "\\" + file.Name))
- File.Delete(pathString + "\\" + file.Name);
- File.Move(file.FullName, pathString);
- }
- System.IO.File.Create(pathString + "\\UrlList.txt");
- }
- }
Решение задачи: «WebClient.DownloadFileAsync и потеря данных (скачивание картинок с сервера)»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Net;
- using System.IO;
- namespace WebLoader
- {
- public class FileLoader
- {
- WebClient client = new WebClient();
- EventWaitHandle ready = new AutoResetEvent(false);
- List<string> urlsList;
- public FileLoader(List<string> urls)
- {
- urlsList = urls;
- client.DownloadFileCompleted += (s, e) => { ready.Set(); };
- new Thread(Work).Start();
- }
- void Work()
- {
- ready.Set();
- for(int i=0; i<urlsList.Count; i++)
- {
- Uri myUri = new Uri(urlsList[i]);
- client.DownloadFileAsync(myUri, string.Format("{0}{1}", Directory.GetCurrentDirectory(), "MyFile" + i + ".txt"));
- ready.WaitOne();
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д