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

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

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

Цель: получить код html-страницы. Пробовал использовать WebClient.DownloadFile . не пошло, потому что иногда он завешивал выполнение программы. Решил пойти окольными путями, стал использовать WebClient.DownloadFileAsync и пускать его в отдельный поток, при этом использовав следующее
 wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(SetDownloadedSuccessState);
 
 // Говорим что файл успешно скачан
        static void SetDownloadedSuccessState(object sender, DownloadProgressChangedEventArgs e)
        {
            if (e.ProgressPercentage == 100)
                FileDownloaded = true;
        }
 
        static Boolean FileDownloaded;
Казалось бы, круто, файл качает, но в итоге вижу что файл-то создаётся, только вот размер у него 0 килобайт. Нагородил такую конструкцию
   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;
        }

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


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

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

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