WebClient признак полного скачивания файла - C#
Формулировка задачи:
Цель: получить код html-страницы. Пробовал использовать WebClient.DownloadFile . не пошло, потому что иногда он завешивал выполнение программы. Решил пойти окольными путями, стал использовать WebClient.DownloadFileAsync и пускать его в отдельный поток, при этом использовав следующее
Казалось бы, круто, файл качает, но в итоге вижу что файл-то создаётся, только вот размер у него 0 килобайт. Нагородил такую конструкцию
но при чтении полученного файла всё равно вижу, что код страницы (ИНОГДА) записывается в файл не весь.
Как всё-таки грамотно решить эту задачу? Быстро и со стопроцентной уверенностью закачивать на жёсткий диск полный код страницы? Желательно именно вебклиентом
Листинг программы
- wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SetDownloadedSuccessState);
- // Говорим что файл успешно скачан
- static void SetDownloadedSuccessState(object sender, DownloadProgressChangedEventArgs e)
- {
- if (e.ProgressPercentage == 100)
- FileDownloaded = true;
- }
- static Boolean FileDownloaded;
Листинг программы
- public static void DownloadFileMAIN(string linka,string filepath)
- {
- Uri uri = new Uri(linka);
- if (!Directory.Exists(String.Format(@"{0}\Data", Application.StartupPath)))
- Directory.CreateDirectory(String.Format(@"{0}\Data", Application.StartupPath));
- if (File.Exists(filepath))
- File.Delete(filepath);
- Thread threadDownload = new Thread(delegate() { HTTPQueries.DownloadFile(uri, filepath); });
- threadDownload.Start();
- System.IO.FileInfo file;
- long size = 0;
- Boolean downloaded_completely = false;
- while (!downloaded_completely)
- {
- if (FileDownloaded)
- {
- while (size == 0)
- {
- if (File.Exists(filepath))
- {
- file = new System.IO.FileInfo(filepath);
- size = size = file.Length;
- if (size == 0)
- Thread.Sleep(500);
- else
- {
- downloaded_completely = true;
- break;
- }
- }
- }
- }
- }
- // останавливаем поток
- threadDownload.Abort();
- threadDownload.Join();
- }
- // Метод выполняется в отдельном потоке
- public static void DownloadFile(Uri linka, string filepath)
- {
- string result = string.Empty;
- FileDownloaded = false;
- WebClient wc = new WebClient();
- wc.Proxy = new System.Net.WebProxy();
- wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SetDownloadedSuccessState);
- // запускаем таймер
- Stopwatch stopwatch = new Stopwatch();
- while (!FileDownloaded)
- {
- if (FileDownloaded)
- break;
- stopwatch.Reset();
- stopwatch.Start();
- wc.DownloadFileAsync(linka, filepath);
- while (stopwatch.Elapsed.Seconds <= 7)
- {
- if (FileDownloaded)
- break;
- System.Threading.Thread.Sleep(777);
- }
- wc.CancelAsync();
- Thread.Sleep(500);
- }
- }
Решение задачи: «WebClient признак полного скачивания файла»
textual
Листинг программы
- public static string GetResponse(string URL)
- {
- string responseString = String.Empty;
- while (responseString==String.Empty)
- {
- HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
- //request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
- request.KeepAlive = false;
- request.Timeout = 10000;
- request.Proxy = null;
- request.ServicePoint.ConnectionLeaseTimeout = 5000;
- request.ServicePoint.MaxIdleTime = 5000;
- // Read stream
- try
- {
- using (WebResponse response = request.GetResponse())
- {
- using (Stream objStream = response.GetResponseStream())
- {
- using (StreamReader objReader = new StreamReader(objStream))
- {
- responseString = objReader.ReadToEnd();
- objReader.Close();
- }
- objStream.Flush();
- objStream.Close();
- }
- response.Close();
- }
- }
- catch (IOException ex)
- {
- Thread.Sleep(1000);
- }
- catch (WebException wex)
- {
- return "WebExcept";
- }
- }
- return responseString;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д