C# · 12月 26, 2021

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,buffer.Length);
if (l > 0)
outStream.Write(buffer,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,;
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);
}
}