zoukankan      html  css  js  c++  java
  • 问题解答集

    目录

    问题解答集    1

    目录    2

    修订历史纪录    3

    1 什么是.net    4

    1.1    .net的定义    4

    1.2 什么是C#    4

    1.3    C#与C,C++的相同之处    5

    2 有关Update程序    6

    2.1 WinFormButton控件的使用    6

    2.2 double类型的变量保留固定位数的小数部分    7

    2.3 如何使用浏览文件夹和确定保存地址    7

    2.4 如何读取本地的.txt 文件    7

    2.5 如何调用.exe文件    7

    2.6 如何获取.exe文件所在地址    8

    2.7 如何获取下载文件的大小    8

    2.8 如何实现具有断点续传功能的文件下载    8

    2.9 ProgressBar的使用    13

    2.10 在Xml文件中修改节点    13

    1 什么是.net

    1. .net的定义

    NET Framework是Microsoft为开发应用程序而创建的一个富有革命性的新平台。

    这句话最有趣的地方是它的含糊不清,但这是有原因的。首先,注意这句话没有说"在Windows操作系统上开发应用程序"。尽管.NET Framework的Microsoft版本运行在Windows操作系统上,但以后将推出运行在其他操作系统上的版本,例如Mono,它是.NET Framework的开发源代码版本(包含一个C#编译器),该版本可以运行在几个操作系统上,包括各种Linux版本和Mac OS。许多这类项目正在开发,在读者阅读本书时可能就已发布了。另外,还可以在个人数字助手(PDA)类设备和一些智能电话上使用Microsoft .NET Compact Framework(基本上是完整 .NET Framework的一个子集)。使用.NET Framework的一个主要原因是它可以作为集成各种操作系统的方式。

    另外,上面给出的.NET Framework定义并没有限制应用程序的类型。这是因为本来就没有限制。.NET Framework可以创建Windows应用程序、Web应用程序、Web服务和其他各种类型的应用程序。

    .NET Framework的设计方式保证它可以用于各种语言,包括本书要介绍的C#语言,以及C++、Visual Basic、JScript,甚至一些旧的语言,如COBOL。为此,还推出了这些语言的.NET版本,目前还在不断推出更多的.NET版本的语言。所有 这些语言都可以访问.NET Framework,它们还可以彼此交互。C#开发人员可以使用Visual Basic程序员编写的代码,反之亦然。

    所有这些提供了意想不到的多样性,这也是.NET Framework具有诱人前景的部分原因

    1.2 什么是C#

    C#(读做 "C sharp",中文译音"夏普")是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.

    1. C#与C,C++的相同之处

    编译:程序直接编译成标准的二进制可执行形式.但C#的源程序并不是被编译成二进制可执行形式,而是一中中间语言,类似于JAVA字节码。如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.

    结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据申明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.

    预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:

    #define

    #undef

    #if

    #elif

    #else

    #endif

    #warning

    #error

    #line []

    没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.

    操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:

    + - ! ~ ++ -- true false

    能够被重载的二元运算符是:

    + - * / % & | ^ << >> == != > < >= <=

    2 有关Update程序

    2.1 WinForm中Button控件的使用

    button下的 this.Text = "what..."; 可以改变窗口标题。

    button下的Message.Show("what..."); 可以弹出对话框,对话框中显示其中文字。button下的Application.Exit; 单击后推出程序。

    2.2 将double类型的变量保留固定位数的小数部分

    System.Math.Round(double型变量,保留位数)。

    2.3 如何使用浏览文件夹和确定保存地址

    浏览(button)和位置(textBox)代码

        private void button2_Click(object sender, System.EventArgs e)

    {

        if    (this.folderBrowserDialog1.ShowDialog()==DialogResult.OK)

        {

            this.textBox1.Text=folderBrowserDialog1.SelectedPath.ToString();

        }    

    }

    2.4 如何读取本地的.txt 文件

    FileStream oldFile = new FileStream("1.txt", FileMode.Open);

    StreamReader sr1 = new StreamReader(oldFile);

    formerEdition = sr1.ReadLine();

    此处读取.exe文件所在文件夹的1.txt文件,此处指读取一行,程序中用于读取本地版本号。

    2.5 如何调用.exe文件

    private void button1_Click(object sender, EventArgs e)

    {

    string exe_path = @"C:\Program Files\Tencent\QQ\";

    System.Diagnostics.Process process = new System.Diagnostics.Process();

    process.StartInfo.FileName = "qq.exe";

    process.StartInfo.WorkingDirectory = exe_path;

    process.StartInfo.CreateNoWindow =true ;

    process.Start();

    if (process.HasExited)

    {

    MessageBox.Show("complete");

    }

    }

    此处用于在下载完更新文件后自动运行。可将此代码粘到下载代码后(用于Update程序)。

    2.6 如何获取.exe文件所在地址

    di = Path.GetDirectoryName(Application.ExecutablePath);

    此前需要加入using System.IO;

     

    另外,使用Environment.GetEnvironmentVariable("path")函数可以达到同样的效果

    2.7 如何获取下载文件的大小

    System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("http://172.27.8.103/Update/%E7%81%AB%E5%BD%B1/火影.rar");

    System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();

    long totalBytes = myrp.ContentLength;

     

    前两行用于与服务器建立连接,第三行用于获得下载文件的大小。

    2.8 如何实现具有断点续传功能的文件下载

    di = Path.GetDirectoryName(Application.ExecutablePath);

     

    di += "\\abc.rar";

    long lStartPos = 0; //用于记录断点位置

     

    System.IO.FileStream fs;

     

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

    {

     

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

     

    lStartPos = fs.Length;

     

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

     

    }

     

    else

    {

     

    fs = new System.IO.FileStream(di, System.IO.FileMode.Create);//fiel stream***************************************

     

    lStartPos = 0;

     

    }

     

     

     

     

     

     

     

     

    Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("http://172.27.8.103/Update/%E7%81%AB%E5%BD%B1/火影.rar");

    //************

    //***************************2007-9-4

    if (lStartPos > 0)

     

    Myrq.AddRange((int)lStartPos); //设置Range值

     

     

    //**************************2007-9-4

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

     

     

     

     

     

     

     

     

     

    long totalDownloadedByte = lStartPos;

    this.timer1.Enabled = true;

     

     

     

     

    System.IO.Stream st = Myrq.GetResponse().GetResponseStream();

     

     

     

     

    byte[] by = new byte[1024];

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

     

    int aaa = 0;

    while (osize > 0)

    {

    totalDownloadedByte = osize + totalDownloadedByte;

    Application.DoEvents();

    fs.Write(by, 0, osize);

    Prog.Value = (int)totalDownloadedByte;

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

    label2.Text = Convert.ToString((long)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" + "/" + Convert.ToString(System.Math.Round(((float)((double)(totalBytes) / 1024) / 1024), 2)) + "MB";

    else

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

    this.label8.Text = "已用时间" + Convert.ToString(totalseconds) + "s";

    if (stop)

    {

    st.Close();

    fs.Close();

    return;

    }

    }

    aaa++;

    if (stop)

    {

    st.Close();

    fs.Close();

    return;

    }

     

    }

     

     

    this.timer1.Enabled = false;

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

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

    else

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

    this.label8.Text ="已用时间" + Convert.ToString(totalseconds) + "s";

    此段程序的执行过程是,首先在.exe文件所在的文件加中寻找是否存在abc.exe文件,如果已存在(上一次的下载并未完成),获取abc.exe文件的大小,并设置文件流中的指针,以使其指向文件的末尾,同时为设置与服务器连接时的Range值做准备。如果不存在abc.exe文件,则创建。之后建立与服务器的连接,并相应的设置其Range值,之后进行下载。下载同时,加入了下载速率,剩余时间,已用时间等的计算,并相应的设置ProgressBar.Value的值。由于下载速率等刷新速度过快,加入while循环语句,使其刷新速率落后于ProgressBar的刷新速率2000倍(经过测试比较合适)。为使最后的下载值与最后的文件大小相适,下载完再刷新一次。

    2.9 ProgressBar的使用

    使用时先要设置ProgressBar.Maximun的值,在刷新设置ProgressBar.Value的值时,其值不得大于ProgressBar.Maximun的值。可将ProgressBar.Value值的设置放到下载循环中,以用于刷新。

    2.10 在Xml文件中修改节点

    XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
       foreach(XmlNode xn in nodeList)//遍历所有子节点
       {
        XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
        if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为"李赞红"
        {
         xe.SetAttribute("genre","update李赞红");//则修改该属性为"update李赞红"
     
         XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
         foreach(XmlNode xn1 in nls)//遍历
         {
          XmlElement xe2=(XmlElement)xn1;//转换类型
          if(xe2.Name=="author")//如果找到
          {
           xe2.InnerText="亚胜";//则修改
           break;//找到退出来就可以了
          }
         }
         break;
        }
       }
     
       xmlDoc.Save("bookstore.xml");//保存。

     

    相应被修改的Xml文件如下:

     

    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </book>
    </bookstore>

  • 相关阅读:
    linux vsftpd
    java运用FFMPEG视频转码技术
    使用ffmpeg实现转码样例(代码实现)
    最简单的基于FFMPEG的转码程序
    关于Android Studio升级到2.0后和Gradle插件不兼容的问题
    Android设计模式之命令模式、策略模式、模板方法模式
    Android设计模式源码解析之桥接模式
    Android 项目利用 Android Studio 和 Gradle 打包多版本APK
    RTMP协议详解(转)
    Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
  • 原文地址:https://www.cnblogs.com/lexus/p/977344.html
Copyright © 2011-2022 走看看