C#同步、异步远程下载文件实例
作者:
1、使用HttpWebRequest/HttpWebResonse和WebClient
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
if (!response.ContentType.ToLower().StartsWith("text/"))
{
//Value = SaveBinaryFile(response, FileName);
byte[] buffer = new byte[1024];
Stream outStream = System.IO.File.Create(FileName);
Stream inStream = response.GetResponseStream();
int l;
do
{
l = inStream.Read(buffer, 0, buffer.Length);
if (l > 0)
outStream.Write(buffer, 0, l);
}
while (l > 0);
outStream.Close();
inStream.Close();
}
2、使用WebClient
string url = "http://www.mozilla.org/images/feature-back-cnet.png";
WebClient myWebClient = new WebClient();
myWebClient.DownloadFile(url,"C:\\temp\\feature-back-cnet.png");
3、异步下载例子
///summary
///异步分析下载
///summary
private void AsyncAnalyzeAndDownload(string url, string savePath)
{
this.uriString = url;
this.savePath = savePath;
#region 分析计时开始
count = 0;
count1 = 0;
freq = 0;
result = 0;
QueryPerformanceFrequency(ref freq);
QueryPerformanceCounter(ref count);
#endregion
using (WebClient wClient = new WebClient())
{
AutoResetEvent waiter = new AutoResetEvent(false);
wClient.Credentials = CredentialCache.DefaultCredentials;
wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze);
wClient.DownloadDataAsync(new Uri(uriString), waiter);
waiter.WaitOne(); 阻止当前线程,直到收到信号
}
}
///summary
///异步分析
///summary
protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e)
{
AutoResetEvent waiter = (AutoResetEvent)e.UserState;
try
{
if (!e.Cancelled && e.Error == null)
{
string dnDir = string.Empty;
string domainName = string.Empty;
string uri = uriString;
获得域名 [url]httpwww.sina.com[url]
Match match = Regex.Match(uri, @((http(s)))+[w-.]+[^]);, RegexOptions.IgnoreCase
domainName = match.Value;
获得域名最深层目录 [url]httpwww.sina.commail[url]
if (domainName.Equals(uri))
dnDir = domainName;
else
dnDir = uri.Substring(0, uri.LastIndexOf(''));
dnDir += '';
获取数据
string pageData = Encoding.UTF8.GetString(e.Result);
Liststring urlList = new Liststring();
匹配全路径
match = Regex.Match(pageData, @((http(s)))+((()+[w-.]+()))+[w-.]+.+( + ImageType + )); , RegexOptions.IgnoreCase
while (match.Success)
{
string item = match.Value;
短路径处理
if (item.IndexOf(http) == -1 && item.IndexOf(https) == -1)
item = (item[0] == '' domainName dnDir) + item;
if (!urlList.Contains(item))
{
urlList.Add(item);
imgUrlList.Add(item);
实时显示分析结果
AddlbShowItem(item);
边分析边下载
WebRequest hwr = WebRequest.Create(item);
hwr.BeginGetResponse(new AsyncCallback(AsyncDownLoad), hwr);
hwr.Timeout = 0x30D40; 默认 0x186a0 - 100000 0x30D40 - 200000
hwr.Method = POST;
hwr.C;
hwr.MaximumAutomaticRedirections = 3;
hwr.Accept =imagegif, imagex-xbitmap, imagejpeg, imagepjpeg, applicationx-shockwave-flash, applicationvnd.ms-excel, applicationvnd.ms-powerpoint, applicationmsword, ;
hwr.Accept = imagegif, imagex-xbitmap, imagejpeg, imagepjpeg, ;
IAsyncResult iar = hwr.BeginGetResponse(new AsyncCallback(AsyncDownLoad), hwr);
iar.AsyncWaitHandle.WaitOne();
}
match = match.NextMatch();
}
}
}
finally
{
waiter.Set();
#region 分析计时结束
QueryPerformanceCounter(ref count1);
count = count1 - count;
result = (double)(count) (double)freq;
toolStripStatusLabel1.Text = 分析完毕!;
toolStripStatusLabel2.Text = string.Format( 分析耗时{0}秒, result);
Application.DoEvents();
#endregion
分析完毕
isAnalyzeComplete = true;
}
}
/// <summary>
/// 异步接受数据
/// </summary>
/// <param name="asyncResult"></param>
public void AsyncDownLoad(IAsyncResult asyncResult)
{
#region 下载计时开始
if (cfreq == 0)
{
QueryPerformanceFrequency(ref cfreq);
QueryPerformanceCounter(ref ccount);
}
#endregion
WebRequest request = (WebRequest)asyncResult.AsyncState;
string url = request.RequestUri.ToString();
try
{
WebResponse response = request.EndGetResponse(asyncResult);
using (Stream stream = response.GetResponseStream())
{
Image img = Image.FromStream(stream);
string[] tmpUrl = url.Split('.');
img.Save(string.Concat(savePath, "/", DateTime.Now.ToString("yyyyMMddHHmmssfff"), ".", tmpUrl[tmpUrl.Length - 1]));
img.Dispose();
stream.Close();
}
allDone.Set();
//从未下载的列表中删除已经下载的图片
imgUrlList.Remove(url);
//更新列表框
int indexItem = this.lbShow.Items.IndexOf(url);
if (indexItem >= 0 && indexItem <= this.lbShow.Items.Count)
SetlbShowItem(indexItem);
}
catch (Exception)
{
imgUrlList.Remove(url);
}
}