问题解答集
目錄
問題解答集????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 WinForm中Button控件的使用????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
.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網絡框架的主角.
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"?> |
總結
- 上一篇: 博主应邀参加YOCSEF虚拟化技术论坛
- 下一篇: Disable anchor tag的j