问题解答集

目 录

问题解答集目 录    1

目 录    2

修订历史纪录    3

1 什么是Visual studio.net    4

1.1 Visual studio.net 简介    4

1.2 NET Framework-Microsoft Visual Studio.NET 简介    4

2 update程序问题    5

2.1 怎样下载文件    5

2.2 如何获取文件的大小    5

2.3 如何使用进度条    6

2.4 Timer控件的使用    6

2.5 如何显示下载速度,下载百分比,下载时间及剩余时间    7

2.6 如何间隔刷新显示的数据    8

2.6 如何实现断点续传    9

 

1 什么是Visual studio.net

1.1 Visual studio.net 简介

Visual Studio.NET是.NET平台下最为强大的开发工具,无论是软件服务商,还是企业应用程序的部署与发布,Visual Studio.NET都可以提供近乎完美的解决方案。Visual Studio.NET提供了包括设计、编码、编译调试、数据库联接操作等基本功能和基于开放架构的服务器组件开发平台、企业开发工具和应用程序重新发布工具以及性能评测报告等高级功能。

1.2 NET Framework-Microsoft Visual Studio.NET 简介

Web 应用程序(以因特网为基础的应用程序)的优点在于可以让企业间的商业数据及交易等行为,透过因特网的通讯来彼此交换讯息。这样不但可以节省数据交换的时间,而且可以简化流程。但是在新一代的.NET 开发平台还没有出现之前,要让因特网应用程序达到上述的功能是一项浩大的工程。牵涉到的技术及程序开发语言,可能包括了HTML、ASP、VBScript、JavaScript、C++、ADO、SQL、COM、MTS 等。这样的环境对于开发人员来说,想要快速的开发一个功能强大且稳定可靠的Web 应用程序,不是一项轻松的工作。之前的Microsoft Visual StudioTM(微软的解决方案开发平台)及Windows 上的一些架构及服务,已经帮助程序设计师由单机平台的程序开发转为主从式(Client/Server)的架构来开发应用程序。但是对于现在的环境而言,因为企业的客户或供货商等所使用的系统或软件可能不尽相同,
开发人员所要面对的挑战是要如何整合所有的异质性资源,所以必须把焦点转到如何发展分布式的因特网应用程序架构,好整合这些存在于不同平台或不同软件的异质资源。目前全世界有超过六百万的专业程序设计师,而百分之70 以上的人使用微软的Visual Studio 开发平台;现今最受欢迎的架构则为主/从式的架构,而发展最快速的架构则是以Web 为基础的架构。在这种架构下程序逻辑及数据的处理都是在伺服端,使用者是透过网络以浏览器来存取伺服端的数据。这种架构的开发工具,微软早在前两版的Visual Studio 中透过Active Server Pages(ASP)以及IIS 3.0 就已经提供了。为了因应Web 架构的快速发展及广大程序开发人员的需求,微软亦举办了不下百场的研讨会和开发人员沟通、交换意见;就是为了提供给开发人员更好的解决方案开发平台。而这个新一代开发平台目前已经推出了,即为Visual Studio.NET。VisualStudio.NET 开发平台里面包含Visual Basic.NET、C#、Visual C++、ASP.NET 以及VisualFoxPro。为了让这套开发平台更容易开发以因特网为基础的应用程序,这个开发平台做了许多和以往不同的改革,这个改革就是.NET Framework。.NET 架构(就是.NET Framework,.NET念作dot Net)就是为了让开发分布式因特网应用程序架构变得更简单容易而发展出来的。

2 update程序问题

2.1 怎样下载文件

可以使用:

//从网上下载文件

System.Net.WebClient Client = new WebClient();

Client.DownloadFile(source, direction);

其中source和direction分别是文件的源地址和目的地址。

此方法只是后台运行,无法知道下载速度,进度之类的信息。

2.2 如何获取文件的大小

// 获取文件的大小

System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(source); System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();

long totalBytes = myrp.ContentLength;

totalBytes的值就是文件大小,文件大小在使用进度条和计算速度的时候会用到。

    

2.3 如何使用进度条

进度条是visual studio中的一个控件,将控件拖到所需地方,在代码中设置其属性即可:

// 显示进度条

Prog.Maximum = (int)totalBytes;

System.IO.Stream st = myrp.GetResponseStream();

System.IO.Stream so = new System.IO.FileStream(direction, System.IO.FileMode.Create);

long totalDownloadedByte = 0;

this.timer1.Enabled = true;

 

byte[] by = new byte[1024];

int osize = st.Read(by, 0, (int)by.Length);

while (osize > 0)

{

totalDownloadedByte = osize + totalDownloadedByte;

Application.DoEvents();

so.Write(by, 0, osize);

Prog.Value = (int)totalDownloadedByte;

osize = st.Read(by, 0, (int)by.Length);

label2.Text = Convert.ToString((int)totalDownloadedByte*100/totalBytes)+"%"; //显示下载的百分比

}

this.timer1.Enabled = false;

so.Close();

st.Close();

}

 

Prog.Maximum的值对应进度条的百分百的位置,亦即要下载的文件总大小,Prog.Value是下载文件的大小,控件能够自动把这两个值换算称进度条的长度。

 

注意:此代码毋与2.1中的"文件下载"代码合用。因为此段代码本身以具有下载功能,所以两个合用的话会出现下载两次的情况。

 

2.4 Timer控件的使用

Timer控件是一个计时工具:

this.timer1.Enabled = true; 表示开始计时,

this.timer1.Enabled = false; 表示结束计时,

计时的时间间隔是通过间隔属性设定的,如图:

 

此中的"1000"表示每隔1000毫秒执行一次Timer控件类中的代码。

2.5 如何显示下载速度,下载百分比,下载时间及剩余时间

根据从2.2中获得的文件大小,2.4中计时得到的时间,通过计算即可得到,代码如下:

 

label2.Text = Convert.ToString((int)totalDownloadedByte*100/totalBytes)+"%"; //显示下载的百分比

 

if (totalDownloadedByte / (1024 * totalseconds * 1024) <= 0)

this.label3.Text = "平均速度:" + (totalDownloadedByte / (1024 * totalseconds)) + "KB/s";

else

this.label3.Text = "平均速度:" + System.Math.Round(((float)totalDownloadedByte / (1024 * totalseconds * 1024)), 2) + "MB/s";

 

this.label6.Text = "剩余时间:" + ((totalBytes - totalDownloadedByte) / (totalDownloadedByte / totalseconds)) + "s";

if (totalDownloadedByte / (1024 * 1024) <= 0)

this.label7.Text = "已下载:" + System.Math.Round(((float)totalDownloadedByte / 1024), 2) + "KB";

else

this.label7.Text = "已下载:" + System.Math.Round(((float)totalDownloadedByte / (1024 * 1024)), 2) + "MB";

this.label8.Text = Convert.ToString(totalseconds);

 

2.6 如何间隔刷新显示的数据

如果直接使用2.5中的代码,会出现刷新频率太快的现象,以至于会使页面看起来比较乱,所以需要间隔一小段时间刷新的效果。使用循环即可实现,而且可以根据需求修改时间间隔:

int aaa = 0;

while ()

{

 

label2.Text = Convert.ToString((int)totalDownloadedByte*100/totalBytes)+"%"; //显示下载的百分比

if ((aaa % 2000) == 0)

{

if (totalDownloadedByte / (1024 * totalseconds * 1024) <= 0)

this.label3.Text = "平均速度:" + (totalDownloadedByte / (1024 * totalseconds)) + "KB/s";

else

this.label3.Text = "平均速度:" + System.Math.Round(((float)totalDownloadedByte / (1024 * totalseconds * 1024)), 2) + "MB/s";

 

this.label6.Text = "剩余时间:" + ((totalBytes - totalDownloadedByte) / (totalDownloadedByte / totalseconds)) + "s";

if (totalDownloadedByte / (1024 * 1024) <= 0)

this.label7.Text = "已下载:" + System.Math.Round(((float)totalDownloadedByte / 1024), 2) + "KB";

else

this.label7.Text = "已下载:" + System.Math.Round(((float)totalDownloadedByte / (1024 * 1024)), 2) + "MB";

this.label8.Text = Convert.ToString(totalseconds);

}

aaa++;

 

}

 

2.6 如何实现断点续传

顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

完成HTTP请求
System.Net.HttpWebRequest

HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。

HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置。下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。但是注意,某些公共标头被视为受限制的,它们或者直接由 API公开,或者受到系统保护,不能被更改。Range也属于被保护之列,不过,.NET为开发者提供了更方便的操作,就是 AddRange方法,向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头

完成文件访问
System.IO.FileStream

FileStream 对象支持使用Seek方法对文件进行随机访问, Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由SeekOrigin类的三个属性表示。

代码如下:

static void Main(string[] args)

              {

                      

                     string StrFileName="c:\\aa.zip";      //根据实际情况设置

                     string StrUrl="http://www.xxxx.cn/xxxxx.zip";   //根据实际情况设置

   

                     //打开上次下载的文件或新建文件

                     long lStartPos =0;

                     System.IO.FileStream fs;

                     if (System.IO.File.Exists(StrFileName))

                     {

                            fs= System.IO.File.OpenWrite(StrFileName);

                            lStartPos=fs.Length;

                            fs.Seek(lStartPos,System.IO.SeekOrigin.Current);   //移动文件流中的当前指针

                     }

                     else

                     {

                            fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);

                            lStartPos =0;

                     }

                      

                     //打开网络连接

                     try

                     {

                            System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);</P



                       if ( lStartPos>0)

                                   request.AddRange((int)lStartPos);    //设置Range

                             

                            //向服务器请求,获得服务器回应数据流

                            System.IO.Stream ns= request.GetResponse().GetResponseStream();

   

                            byte[] nbytes = new byte[512];

                            int nReadSize=0;

                            nReadSize=ns.Read(nbytes,0,512);

                            while( nReadSize >0)

                            {

                                   fs.Write(nbytes,0,nReadSize);

                                   nReadSize=ns.Read(nbytes,0,512);

                            }

                            fs.Close();

                            ns.Close();

                            Console.WriteLine("下载完成");

                     }

                     catch(Exception ex)

                     {

                            fs.Close();

                            Console.WriteLine("下载过程中出现错误:"+ex.ToString());

                     }

              }

3 使用的小工具

在编写过程中,使用到了一个流量监控的小工具,使用它来检查update程序下载速度大小的准确性。

 

通过"选项",可以设置适合自己的属性:

4 附

参考资料见《[FAQ]蔡培森2007912.chm》

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/lexus/p/977333.html