WebClient признак полного скачивания файла - C#

Узнай цену своей работы

Формулировка задачи:

Цель: получить код html-страницы. Пробовал использовать WebClient.DownloadFile . не пошло, потому что иногда он завешивал выполнение программы. Решил пойти окольными путями, стал использовать WebClient.DownloadFileAsync и пускать его в отдельный поток, при этом использовав следующее
Листинг программы
  1. wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SetDownloadedSuccessState);
  2. // Говорим что файл успешно скачан
  3. static void SetDownloadedSuccessState(object sender, DownloadProgressChangedEventArgs e)
  4. {
  5. if (e.ProgressPercentage == 100)
  6. FileDownloaded = true;
  7. }
  8. static Boolean FileDownloaded;
Казалось бы, круто, файл качает, но в итоге вижу что файл-то создаётся, только вот размер у него 0 килобайт. Нагородил такую конструкцию
Листинг программы
  1. public static void DownloadFileMAIN(string linka,string filepath)
  2. {
  3. Uri uri = new Uri(linka);
  4. if (!Directory.Exists(String.Format(@"{0}\Data", Application.StartupPath)))
  5. Directory.CreateDirectory(String.Format(@"{0}\Data", Application.StartupPath));
  6. if (File.Exists(filepath))
  7. File.Delete(filepath);
  8. Thread threadDownload = new Thread(delegate() { HTTPQueries.DownloadFile(uri, filepath); });
  9. threadDownload.Start();
  10. System.IO.FileInfo file;
  11. long size = 0;
  12. Boolean downloaded_completely = false;
  13. while (!downloaded_completely)
  14. {
  15. if (FileDownloaded)
  16. {
  17. while (size == 0)
  18. {
  19. if (File.Exists(filepath))
  20. {
  21. file = new System.IO.FileInfo(filepath);
  22. size = size = file.Length;
  23. if (size == 0)
  24. Thread.Sleep(500);
  25. else
  26. {
  27. downloaded_completely = true;
  28. break;
  29. }
  30. }
  31. }
  32. }
  33. }
  34. // останавливаем поток
  35. threadDownload.Abort();
  36. threadDownload.Join();
  37. }
  38. // Метод выполняется в отдельном потоке
  39. public static void DownloadFile(Uri linka, string filepath)
  40. {
  41. string result = string.Empty;
  42. FileDownloaded = false;
  43. WebClient wc = new WebClient();
  44. wc.Proxy = new System.Net.WebProxy();
  45. wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SetDownloadedSuccessState);
  46. // запускаем таймер
  47. Stopwatch stopwatch = new Stopwatch();
  48. while (!FileDownloaded)
  49. {
  50. if (FileDownloaded)
  51. break;
  52. stopwatch.Reset();
  53. stopwatch.Start();
  54. wc.DownloadFileAsync(linka, filepath);
  55. while (stopwatch.Elapsed.Seconds <= 7)
  56. {
  57. if (FileDownloaded)
  58. break;
  59. System.Threading.Thread.Sleep(777);
  60. }
  61. wc.CancelAsync();
  62. Thread.Sleep(500);
  63. }
  64. }
но при чтении полученного файла всё равно вижу, что код страницы (ИНОГДА) записывается в файл не весь. Как всё-таки грамотно решить эту задачу? Быстро и со стопроцентной уверенностью закачивать на жёсткий диск полный код страницы? Желательно именно вебклиентом

Решение задачи: «WebClient признак полного скачивания файла»

textual
Листинг программы
  1.    public static string GetResponse(string URL)
  2.         {
  3.             string responseString = String.Empty;
  4.             while (responseString==String.Empty)
  5.             {
  6.                 HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
  7.                 //request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
  8.                 request.KeepAlive = false;
  9.                 request.Timeout = 10000;
  10.                 request.Proxy = null;
  11.  
  12.                 request.ServicePoint.ConnectionLeaseTimeout = 5000;
  13.                 request.ServicePoint.MaxIdleTime = 5000;
  14.  
  15.                 // Read stream
  16.                
  17.                 try
  18.                 {
  19.                     using (WebResponse response = request.GetResponse())
  20.                     {
  21.                         using (Stream objStream = response.GetResponseStream())
  22.                         {
  23.                             using (StreamReader objReader = new StreamReader(objStream))
  24.                             {
  25.                                 responseString = objReader.ReadToEnd();                                
  26.                                 objReader.Close();
  27.                             }
  28.                             objStream.Flush();
  29.                             objStream.Close();
  30.                         }
  31.                         response.Close();
  32.                     }
  33.                 }
  34.                 catch (IOException ex)
  35.                 {
  36.                     Thread.Sleep(1000);
  37.                 }
  38.                 catch (WebException wex)
  39.                 {
  40.                     return "WebExcept";
  41.                 }
  42.             }
  43.            
  44.    
  45.             return responseString;
  46.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут