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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д