目 录
问题解答集目 录 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》
分享到:
相关推荐
【企业会计准则监管问题解答合集】 在上市公司执行企业会计准则的过程中,监管机构对一系列问题提供了详细的解答。这些解答涉及到多个关键的会计处理和报告方面,对于理解和遵守会计准则至关重要。 1. **稀释每股...
### Linux中常见问题解答集 #### 一、基础概念与操作 **1.1 Root用户权限** - **问题描述:** 在Linux系统中,经常需要使用root用户进行一些操作,但有时不知道如何切换到root用户或者担心误用root权限导致系统...
安卓系统手机常见问题解答集.docx
电子杂志制作软件iebook超级精灵XXXX常见问题解答集 大全.docx
电子杂志制作软件iebook超级精灵某常见问题解答集大全.doc
PCB板
ChatGPT技术的使用教程、使用方法、使用技巧、使用注意事项、使用中常见问题
linux常见问题解答集,包括:如何建立多用户、如何使用软盘、光盘以及DOS等非Linux分区、如何安装Linux的应用软件等等
### 宇宙学问题解答集概述 文件标题《Solutions_to_Problems_in_Cosmology.pdf》表明这是一个关于宇宙学问题解答的文档。文档描述表明它是第二版《Physical Foundations of Cosmology》由 V. Mukhanov 所著书中第一...
100个安卓手机常见问题解答锦集.docx100个安卓手机常见问题解答锦集.docx100个安卓手机常见问题解答锦集.docx100个安卓手机常见问题解答锦集.docx100个安卓手机常见问题解答锦集.docx100个安卓手机常见问题解答锦集....
CISCO常见问题及解答(全集)
### Oracle常用问题解答知识点 #### 1. SQL & PL/SQL ##### 1.1 查询特殊字符,如通配符%与_ **问题**: 如何在Oracle中查询包含特殊字符如通配符%与_的数据? **解答**: 在Oracle中查询包含特殊字符如通配符%与_...
武仁第二版的解答集不仅提供了答案,还往往解析了解题步骤和思路,这对于自主学习和复习至关重要。它能帮助学生检查自己的理解,发现并修正错误,同时也能提升他们独立解决问题的能力。 在解答集里,你可以找到关于...
《Chatbot心理健康常见问题解答数据集》是一个专为自然语言处理(NLP)设计的数据集,主要用于训练和优化聊天机器人,使其能够有效地处理与心理健康相关的问题。数据集包含了一个CSV文件Mental_Health_FAQ.csv以及一...
网管常见问题解答集合.rar 网管常见问题解答集合.rar 网管常见问题解答集合.rar
《C语言编程常见问题解答》(C Programming FAQs)是关于C语言的常见问题解答集,由Steve Summit撰写,并于1995年由Addison-Wesley出版(ISBN 0-201-84519-9)。这本书回答了C语言编程社区中常见的495个问题。本书的...
这个"88.MATLAB教程 Matlab 80问.rar"压缩包很可能包含了一套详细的MATLAB问题解答集,涵盖了80个常见问题,旨在帮助用户深入理解和掌握MATLAB的基本用法和高级特性。 1. **基础知识**:MATLAB的基础知识包括变量...
这个压缩包内含的"Review1-2Solutions.pdf"文件,是一个详细的问题解答集,旨在提升我们对数字理论和技术的理解。 首先,我们要明白数字概念是信息技术的基础,它涵盖了二进制、数字编码、数字逻辑以及数字系统等多...