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;
}