欢迎光临
我们一直在努力

用Visual C#实现文件下载功能-.NET教程,C#语言

建站超值云服务器,限时71元/月

一.概述:

  本文通过一个实例向大家介绍用visual c#进行internet通讯编程的一些基本知识。我们知道.net类包含了请求/响应层、应用协议层、传输层等层次。在本程序中,我们运用了位于请求/响应层的webrequest类以及webclient类等来实现高抽象程度的internet通讯服务。本程序的功能是完成网络文件的下载。

  二.实现原理:

  程序实现的原理比较简单,主要用到了webclient类和filestream类。其中webclient类处于system.net名字空间中,该类的主要功能是提供向uri标识的资源发送数据和从uri标识的资源接收数据的公共方法。我们利用其中的downloadfile()方法将网络文件下载到本地。然后用filestream类的实例对象以数据流的方式将文件数据写入本地文件。这样就完成了网络文件的下载。

  三.实现步骤:

  首先,打开visual studio.net,新建一个visual c# windows应用程序的工程,不妨命名为"mygetcar"。

接着,布置主界面。我们先往主窗体上添加如下控件:两个标签控件、两个文本框控件、一个按钮控件以及一个状态栏控件。最终的主窗体如下图所示:

  完成主窗体的设计,我们接着完成代码的编写。

  在理解了基本原理的基础上去完成代码的编写是相当容易。程序中我们主要用到的是webclient类,不过在我们调用webclient类的实例对象前,我们需要用webrequest类的对象发出对统一资源标识符(uri)的请求。

try

{

webrequest myre=webrequest.create(urladdress);

}

catch(webexception exp)

{

messagebox.show(exp.message,"error");

}

  这是一个try-catch语句,try块完成向uri的请求,catch块则捕捉可能的异常并显示异常信息。其中的urladdress为被请求的网络主机名。

  在请求成功后,我们就可以运用webclient类的实例对象中的downloadfile()方法实现文件的下载了。其函数原型如下:

public void downloadfile( string address, string filename);

  其中,参数address为从中下载数据的 uri,filename为要接收数据的本地文件的名称。

之后我们用openread()方法来打开一个可读的流,该流完成从具有指定uri的资源下载数据的功能。其函数原型如下:

 ublic stream openread(string address);

 

  其中,参数address同上。

  最后就是新建一个streamreader对象从中读取文件的数据,并运用一个while循环体不断读取数据,只到读完所有的数据。

  还有在使用以上方法时,你将可能需要处理以下几种异常:

   webexception:下载数据时发生错误。

   uriformatexception:通过组合 baseaddress、address 和 querystring 所构成的 uri 无效。

  这部分的代码如下:(client为webclient对象,在本类的开头处声明即可)

statusbar.text = "开始下载文件…";

client.downloadfile(urladdress,filename);

stream str = client.openread(urladdress);

streamreader reader = new streamreader(str);

byte[] mbyte = new byte[100000];

int allmybyte = (int)mbyte.length;

int startmbyte = 0;

statusbar.text = "正在接收数据…";

while(allmybyte>0)

{

int m = str.read(mbyte,startmbyte,allmybyte);

if(m==0)

break;

startmbyte+=m;

allmybyte-=m;

}

  完成了文件数据的读取工作后,我们运用filestream类的实例对象将这些数据写入本地文件中:

filestream fstr = new filestream(path,filemode.openorcreate,fileaccess.write);

fstr.write(mbyte,0,startmbyte);

  这样,程序主体部分的代码已经完成了,不过要完成全部程序还需要一些工作。由于在程序接收网络文件数据的时候运用到了while循环体,这样会很占程序资源,表现的形式就是主窗体不能自由移动。为了解决这个问题,我们在程序中用到了多线程机制。我们在响应按钮的事件中新建一个线程,该线程就是用来实现网络文件下载功能的。如此,文件下载的线程和程序主线程并存,共享进程资源,使得程序顺畅运行。这样,我们在按钮控件的消息响应函数里添加如下代码:

thread th = new thread(new threadstart(startdownload));

th.start();

  该线程的实现函数就是startdownload(),而上面介绍的那些代码就是这个函数的主体部分。

  最后,因为程序中运用到了webrequest、webclient、filestream、thread等类,所以最重要的就是在程序的开始处添加如下名字空间:

using system.net;

using system.io;

using system.threading;

下面就是程序的源代码:

using system;

using system.drawing;

using system.collections;

using system.componentmodel;

using system.windows.forms;

using system.data;

using system.net;

using system.io;

using system.threading;

namespace mygetcar

{

///

/// form1 的摘要说明。

///

public class form1 : system.windows.forms.form

{

private system.windows.forms.label label1;

private system.windows.forms.label label2;

private system.windows.forms.textbox srcaddress;

private system.windows.forms.textbox taraddress;

private system.windows.forms.statusbar statusbar;

private system.windows.forms.button start;

private webclient client = new webclient();

///

/// 必需的设计器变量。

///

private system.componentmodel.container components = null;

public form1()

{

//

// windows 窗体设计器支持所必需的

//

initializecomponent();

//

// todo: 在 initializecomponent 调用后添加任何构造函数代码

//

}

///

/// 清理所有正在使用的资源。

///

protected override void dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.dispose();

}

}

base.dispose( disposing );

}

#region windows form designer generated code

///

/// 设计器支持所需的方法 – 不要使用代码编辑器修改

/// 此方法的内容。

///

private void initializecomponent()

{

this.label1 = new system.windows.forms.label();

this.label2 = new system.windows.forms.label();

this.srcaddress = new system.windows.forms.textbox();

this.taraddress = new system.windows.forms.textbox();

this.statusbar = new system.windows.forms.statusbar();

this.start = new system.windows.forms.button();

this.suspendlayout();

//

// label1

//

this.label1.location = new system.drawing.point(8, 32);

this.label1.name = "label1";

this.label1.size = new system.drawing.size(72, 23);

this.label1.tabindex = 0;

this.label1.text = "文件地址:";

this.label1.textalign = system.drawing.contentalignment.middleright;

//

// label2

//

this.label2.location = new system.drawing.point(8, 72);

this.label2.name = "label2";

this.label2.size = new system.drawing.size(72, 23);

this.label2.tabindex = 1;

this.label2.text = "另存到:";

this.label2.textalign = system.drawing.contentalignment.middleright;

//

// srcaddress

//

this.srcaddress.location = new system.drawing.point(80, 32);

this.srcaddress.name = "srcaddress";

this.srcaddress.size = new system.drawing.size(216, 21);

this.srcaddress.tabindex = 2;

this.srcaddress.text = "";

//

// taraddress

//

this.taraddress.location = new system.drawing.point(80, 72);

this.taraddress.name = "taraddress";

this.taraddress.size = new system.drawing.size(216, 21);

this.taraddress.tabindex = 3;

this.taraddress.text = "";

//

// statusbar

//

this.statusbar.location = new system.drawing.point(0, 151);

this.statusbar.name = "statusbar";

this.statusbar.size = new system.drawing.size(312, 22);

this.statusbar.tabindex = 4;

//

// start

//

this.start.flatstyle = system.windows.forms.flatstyle.flat;

this.start.location = new system.drawing.point(216, 112);

this.start.name = "start";

this.start.size = new system.drawing.size(75, 24);

this.start.tabindex = 5;

this.start.text = "开始下载";

this.start.click += new system.eventhandler(this.start_click);

//

// form1

//

this.autoscalebasesize = new system.drawing.size(6, 14);

this.clientsize = new system.drawing.size(312, 173);

this.controls.addrange(new system.windows.forms.control[] {

this.start,

this.statusbar,

this.taraddress,

this.srcaddress,

this.label2,

this.label1});

this.maximizebox = false;

this.name = "form1";

this.text = "文件下载器";

this.resumelayout(false);

}

#endregion

///

/// 应用程序的主入口点。

///

[stathread]

static void main()

{

application.run(new form1());

}

private void startdownload()

{

start.enabled = false;

string url = srcaddress.text;

int n = url.lastindexof(/);

string urladdress = url.substring(0,n);

string filename = url.substring(n+1,url.length-n-1);

string dir = taraddress.text;

string path = dir+\\+filename;

try

{

webrequest myre=webrequest.create(urladdress);

}

catch(webexception exp)

{

messagebox.show(exp.message,"error");

}

try

{

statusbar.text = "开始下载文件…";

client.downloadfile(urladdress,filename);

stream str = client.openread(urladdress);

streamreader reader = new streamreader(str);

byte[] mbyte = new byte[100000];

int allmybyte = (int)mbyte.length;

int startmbyte = 0;

statusbar.text = "正在接收数据…";

while(allmybyte>0)

{

int m = str.read(mbyte,startmbyte,allmybyte);

if(m==0)

break;

startmbyte+=m;

allmybyte-=m;

}

filestream fstr = new filestream(path,filemode.openorcreate,fileaccess.write);

fstr.write(mbyte,0,startmbyte);

str.close();

fstr.close();

statusbar.text = "下载完毕!";

}

catch(webexception exp)

{

messagebox.show(exp.message,"error");

statusbar.text = "";

}

start.enabled = true;

}

private void start_click(object sender, system.eventargs e)

{

thread th = new thread(new threadstart(startdownload));

th.start();

}

}

}

  程序完毕,运行程序图示如下:

(开始下载文件时)

(文件下载完毕时)

  四.总结:

  以上我通过一个实例向大家展示了如何用visual c#实现网络文件的下载,我们不难发现用visual c#进行internet通讯编程是非常方便的。在上面的程序中,我们仅仅用到了webclient类的一些方法,而webclient类不光提供了网络文件下载的方法,还提供了文件上传的方法,有兴趣的读者不妨一试――用之实现一个文件上传器。同时这个程序只是一个非常简单的例子,程序下载完一个网页后,它所获得的仅仅是主页面的内容,并不能获得其中的图片、css等文件,所以要做出一个比较好的文件下载器还需读者进一步改进之。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用Visual C#实现文件下载功能-.NET教程,C#语言
分享到: 更多 (0)