﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-牧月人-文章分类-.net专区</title><link>http://www.blogjava.net/zgghc/category/14088.html</link><description>天冷 冷不了我的心 
心痛 痛不断我的情 
  情深 深得像海  
   海 仰望蓝天 
   天 一轮明月 
   月 为我而牧 </description><language>zh-cn</language><lastBuildDate>Mon, 21 May 2007 13:32:48 GMT</lastBuildDate><pubDate>Mon, 21 May 2007 13:32:48 GMT</pubDate><ttl>60</ttl><item><title>用C#的类实现数据结构的堆栈算法</title><link>http://www.blogjava.net/zgghc/articles/118903.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 21 May 2007 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/118903.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/118903.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/118903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/118903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/118903.html</trackback:ping><description><![CDATA[using System; <br />namespace DataStructure <br />{ <br />/// &lt;summary&gt; <br />/// Class1 的摘要说明。 <br />/// &lt;/summary&gt; <br />public class Stack//栈类 <br />{ <br />private int count=0; <br />private Node first=null;//定义首结点 <br />public bool Empty <br />{ <br />get <br />{ <br />return(first==null); <br />} <br />} <br />public int Count <br />{ <br />get <br />{ <br />return count; <br />} <br />} <br />public object Pop()//入栈 <br />{ <br />if(first==null) <br />{ <br />throw new InvalidOperationException("Can not pop from an empty stack;"); <br />} <br />else <br />{ <br />object temp=first.Value; <br />first=first.Next; <br />count--; <br />return temp; <br />} <br />} <br />public void push(object o)//出栈 <br />{ <br />first=new Node(o,first); <br />count++; <br />} <br />public Stack() <br />{ <br />// <br />// TODO: 在此处添加构造函数逻辑 <br />// <br />} <br />} <br />class Node //结点类 <br />{ <br />public Node Next; <br />public object Value; <br />public Node(object value):this(value,null){} <br />public Node(object value,Node next) <br />{ <br />Next=next; <br />Value=value; <br />} <br />} <br />}<img src ="http://www.blogjava.net/zgghc/aggbug/118903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-05-21 15:53 <a href="http://www.blogjava.net/zgghc/articles/118903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# 数据结构排序</title><link>http://www.blogjava.net/zgghc/articles/118899.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 21 May 2007 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/118899.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/118899.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/118899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/118899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/118899.html</trackback:ping><description><![CDATA[
		<p>////冒泡排序<br />//using System;<br />//namespace BubbleSorter <br />//{ <br />// public class BubbleSorter <br />// { <br />//  public void Sort(int[] list) <br />//  { <br />//   int i,j,temp; <br />//   bool done=false; <br />//   j = 1; <br />//   while((j&lt;list.Length)&amp;&amp;(!done)) <br />//   { <br />//    done=true; <br />//    for(i=0;i&lt;list.Length-j;i++) <br />//    { <br />//     if(list[i] &gt; list[i+1]) <br />//     { <br />//      done=false; <br />//      temp=list[i]; <br />//      list[i]=list[i+1]; <br />//      list[i+1]=temp; <br />//     }<br />//    } <br />//    j++; <br />//   } <br />//<br />//  }<br />// }<br />// public class MainClass <br />// { <br />//  public static void Main() <br />//  { <br />//   int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47}; <br />//   BubbleSorter sh=new BubbleSorter(); <br />//   sh.Sort(iArrary); <br />//   for(int m=0;m&lt;iArrary.Length;m++) <br />//   Console.Write("{0} ",iArrary[m]); <br />//   Console.WriteLine(); <br />//  } <br />// } <br />//} </p>
		<p>////选择排序<br />//using System;<br />//<br />//namespace SelectionSorter{<br />// public class SelectionSorter{<br />//  private int min;<br />//  public void Sort(int[] sort){<br />//   for(int i = 0;i &lt; sort.Length -1;i++){<br />//    min = i;<br />//    for(int j = i + 1;j &lt; sort.Length;j++){<br />//     if(sort[j] &lt; sort[min]){<br />//      min = j;<br />//     }<br />//     int t = sort[min];<br />//     sort[min] = sort[i];<br />//     sort[i] = t;<br />//    }<br />//   }<br />//  }<br />//  <br />// }<br />// public class MainClass{<br />//  public static void Main(){<br />//   int[] iArray = new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};<br />//   SelectionSorter ss = new SelectionSorter();<br />//   ss.Sort(iArray);<br />//   for(int m =0;m &lt; iArray.Length;m++)<br />//    Console.Write(iArray[m] + " ");<br />//   Console.Read();<br />//    <br />//  }<br />// }<br />//}<br />//<br />////插入排序<br />//using System;<br />//namespace hc{<br />// public class InsertSort{<br />//  public void sort(int[] list){<br />//   for(int i = 1;i &lt; list.Length;i++){<br />//    int t = list[i];<br />//    int j = i;<br />//    while((j &gt; 0)&amp;&amp;(list[j-1] &gt; t)){<br />//     list[j] = list[j-1];<br />//     --j;<br />//    }<br />//    list[j] = t;<br />//   }<br />//  }<br />// }<br />// public class MainClass{<br />//  public static void Main(){<br />//   int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};<br />//   InsertSort sort1 = new InsertSort();<br />//   sort1.sort(iArrary);<br />//   for(int m = 0;m &lt; iArrary.Length;m++){<br />//    Console.WriteLine(iArrary[m]);<br />//   }<br />//  }<br />// }<br />//}</p>
		<p>////希尔排序,希尔排序是将组分段,进行插入排序.<br />//using System;<br />//namespace hc{<br />// public class ShellSort{<br />//  public void Sort(int[] list){<br />//   int i;<br />//   for(i = 0; i &lt;= list.Length/9;i=3*i+1);<br />//    for(;i &gt; 0;i/=3)<br />//    {  for(int j = i + 1;j &lt;= list.Length;j+=i){<br />//      int t = list[j-1];<br />//      int m = j;<br />//      while((m &gt; i)&amp;&amp;(list[m-i-1] &gt; t)){<br />//       list[m-1] = list[m-i-1];<br />//       m -=i;<br />//      }<br />//      list[m-1] = t;<br />//     }<br />//    }<br />//  }<br />//  <br />// }<br />// public class MainClass{<br />//  <br />//  public static void Main()<br />//  {<br />//   int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};<br />//   ShellSort sr = new ShellSort();<br />//   sr.Sort(iArrary);<br />//   for(int i =0;i &lt; iArrary.Length;i++)<br />//    Console.WriteLine(iArrary[i]);<br />//   Console.Read();<br />//  }<br />// }<br />//}</p>
		<p>////八皇后问题<br />//using System;<br />//namespace hc{<br />// class Queen<br />// {<br />//  const int SIZE = 8;//皇后数<br />//  public static void Main()<br />//  {<br />//   int[] Queen = new int [SIZE];//每行皇后的位置<br />//   int y,x,i,j,d,t=0;<br />//   y = 0;<br />//   Queen[0] = -1;<br />//   while( true )<br />//   {<br />//    for (x=Queen[y]+1; x&lt;SIZE; x++)<br />//    {<br />//     for (i=0;i&lt;y;i++)<br />//     {<br />//      j = Queen[i];<br />//      d = y-i;<br />//      //检查新皇后是否与以前的皇后能相互攻击<br />//      if ((j==x)||(j==x-d)||(j==x+d))<br />//       break;<br />//     }<br />//     if (i&gt;=y)<br />//      break;//不攻击<br />//    }<br />//    if (x == SIZE) //没有合适的位置<br />//    {<br />//     if (0==y)<br />//     {<br />//      //回朔到了第一行<br />//      Console.WriteLine("Done");<br />//      break; //结束<br />//     }<br />//     //回朔<br />//     Queen[y]=-1;<br />//     y--;<br />//    }<br />//    else<br />//    {<br />//     Queen[y]=x;//确定皇后的位置<br />//     y++;//下一个皇后<br />//     if (y&lt;SIZE)<br />//      Queen[y]=-1;<br />//     else<br />//     {<br />//      //所有的皇后都排完了，输出<br />//      Console.WriteLine("\n" + ++t +':');<br />//      for(i=0;i&lt;SIZE;i++)<br />//      {<br />//       for (j=0;j&lt;SIZE;j++)<br />//        if(Queen[i] == j)<br />//         Console.Write('Q');<br />//        else<br />//         Console.Write('.');<br />//       Console.WriteLine();<br />//      }<br />//      y = SIZE -1;//回朔<br />//     }<br />//    }<br />//   }<br />//   Console.Read();<br />//  }<br />// }<br />//<br />//}<br />//<br />////快速排序<br />//using System;   <br />//namespace QuickSorter <br />//{ <br />// public class QuickSorter <br />// { <br />//  private void Swap(ref int l,ref int r) <br />//  { <br />//   int s; <br />//   s=l; <br />//   l=r; <br />//   r=s; <br />//  } <br />//  public void Sort(int [] list,int low,int high) <br />//  { <br />//   int pivot; <br />//   int l,r; <br />//   int mid; <br />//   if(high&lt;=low) <br />//    return; <br />//   else if(high==low+1) <br />//   { <br />//    if(list[low]&gt;list[high]) <br />//     Swap(ref list[low],ref list[high]); <br />//    return; <br />//   } <br />//   mid=(low+high)&gt;&gt;1; <br />//   pivot=list[mid]; <br />//   Swap(ref list[low],ref list[mid]); <br />//   l=low+1; <br />//   r=high; <br />//   do <br />//   { <br />//   while(l&lt;=r&amp;&amp;list[l]&lt;pivot) <br />//    l++; <br />//   while(list[r]&gt;=pivot) <br />//    r--; <br />//    if(l&lt;r) <br />//     Swap(ref list[l],ref list[r]); <br />//   }while(l&lt;r); <br />//   list[low]=list[r]; <br />//   list[r]=pivot; <br />//   if(low+1&lt;r) <br />//    Sort(list,low,r-1); <br />//   if(r+1&lt;high) <br />//    Sort(list,r+1,high); <br />//  } <br />// } <br />// public class MainClass <br />// { <br />//  public static void Main() <br />//  { <br />//   int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47}; <br />//   QuickSorter q=new QuickSorter(); <br />//   q.Sort(iArrary,0,13); <br />//   for(int m=0;m&lt;=13;m++) <br />//    Console.WriteLine("{0}",iArrary[m]); <br />//  } <br />// } <br />//   <br />//} </p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/zgghc/aggbug/118899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-05-21 15:50 <a href="http://www.blogjava.net/zgghc/articles/118899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>P2P聊天程序</title><link>http://www.blogjava.net/zgghc/articles/118895.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 21 May 2007 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/118895.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/118895.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/118895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/118895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/118895.html</trackback:ping><description><![CDATA[
		<p>using System;<br />using System.Drawing;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Windows.Forms;<br />using System.Data;<br />using System.Threading;<br />using System.Net.Sockets;<br />using System.IO;<br />using System.Net;</p>
		<p>namespace Socket<br />{<br /> /// &lt;summary&gt;<br /> /// Form1 的摘要说明。<br /> /// &lt;/summary&gt;<br /> public class Form1 : System.Windows.Forms.Form<br /> {<br />  private System.Windows.Forms.Button button1;<br />  private System.Windows.Forms.Label label1;<br />  private System.Windows.Forms.Label label2;<br />  private System.Windows.Forms.TextBox textBox1;<br />  private System.Windows.Forms.TextBox textBox2;<br />  //声明监听线程对象<br />  private Thread MyListenThread;<br />  //声明网络监听对象<br />  private TcpListener MyTcpListener;<br />  private System.Windows.Forms.RichTextBox richTextBox1;<br />  private System.Windows.Forms.RichTextBox richTextBox2;<br />  private System.Windows.Forms.Label label3;<br />  private System.Windows.Forms.Label label5;<br />  private System.Windows.Forms.Button button2;<br />  private System.Windows.Forms.PictureBox pictureBox1;<br />  private System.Windows.Forms.OpenFileDialog openFileDialog1;<br />  private System.Windows.Forms.ContextMenu contextMenu1;<br />  private System.Windows.Forms.MenuItem menuItem1;<br />  private System.Windows.Forms.MenuItem menuItem2;<br />  private System.Windows.Forms.MenuItem menuItem3;<br />  /// &lt;summary&gt;<br />  /// 必需的设计器变量。<br />  /// &lt;/summary&gt;<br />  private System.ComponentModel.Container components = null;</p>
		<p>  public Form1()<br />  {<br />   //<br />   // Windows 窗体设计器支持所必需的<br />   //<br />   InitializeComponent();</p>
		<p>   //<br />   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码<br />   //<br />  }</p>
		<p>  /// &lt;summary&gt;<br />  /// 清理所有正在使用的资源。<br />  /// &lt;/summary&gt;<br />  protected override void Dispose( bool disposing )<br />  {<br />   if( disposing )<br />   {<br />    if (components != null) <br />    {<br />     components.Dispose();<br />    }<br />   }<br />   base.Dispose( disposing );<br />  }</p>
		<p>  #region Windows 窗体设计器生成的代码<br />  /// &lt;summary&gt;<br />  /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br />  /// 此方法的内容。<br />  /// &lt;/summary&gt;<br />  private void InitializeComponent()<br />  {<br />   System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));<br />   this.button1 = new System.Windows.Forms.Button();<br />   this.label1 = new System.Windows.Forms.Label();<br />   this.label2 = new System.Windows.Forms.Label();<br />   this.textBox1 = new System.Windows.Forms.TextBox();<br />   this.textBox2 = new System.Windows.Forms.TextBox();<br />   this.richTextBox1 = new System.Windows.Forms.RichTextBox();<br />   this.richTextBox2 = new System.Windows.Forms.RichTextBox();<br />   this.label3 = new System.Windows.Forms.Label();<br />   this.label5 = new System.Windows.Forms.Label();<br />   this.button2 = new System.Windows.Forms.Button();<br />   this.pictureBox1 = new System.Windows.Forms.PictureBox();<br />   this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();<br />   this.contextMenu1 = new System.Windows.Forms.ContextMenu();<br />   this.menuItem1 = new System.Windows.Forms.MenuItem();<br />   this.menuItem2 = new System.Windows.Forms.MenuItem();<br />   this.menuItem3 = new System.Windows.Forms.MenuItem();<br />   this.SuspendLayout();<br />   // <br />   // button1<br />   // <br />   this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;<br />   this.button1.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.button1.Location = new System.Drawing.Point(336, 432);<br />   this.button1.Name = "button1";<br />   this.button1.Size = new System.Drawing.Size(96, 32);<br />   this.button1.TabIndex = 0;<br />   this.button1.Text = "发送";<br />   this.button1.Click += new System.EventHandler(this.button1_Click);<br />   // <br />   // label1<br />   // <br />   this.label1.AutoSize = true;<br />   this.label1.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.label1.Location = new System.Drawing.Point(88, 16);<br />   this.label1.Name = "label1";<br />   this.label1.Size = new System.Drawing.Size(66, 17);<br />   this.label1.TabIndex = 1;<br />   this.label1.Text = "远程主机名";<br />   this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;<br />   // <br />   // label2<br />   // <br />   this.label2.AutoSize = true;<br />   this.label2.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.label2.Location = new System.Drawing.Point(280, 16);<br />   this.label2.Name = "label2";<br />   this.label2.Size = new System.Drawing.Size(42, 17);<br />   this.label2.TabIndex = 2;<br />   this.label2.Text = "本机名";<br />   this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;<br />   // <br />   // textBox1<br />   // <br />   this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;<br />   this.textBox1.Location = new System.Drawing.Point(152, 16);<br />   this.textBox1.Name = "textBox1";<br />   this.textBox1.Size = new System.Drawing.Size(104, 21);<br />   this.textBox1.TabIndex = 3;<br />   this.textBox1.Text = "";<br />   // <br />   // textBox2<br />   // <br />   this.textBox2.Anchor = System.Windows.Forms.AnchorStyles.None;<br />   this.textBox2.BackColor = System.Drawing.SystemColors.Desktop;<br />   this.textBox2.BorderStyle = System.Windows.Forms.BorderStyle.None;<br />   this.textBox2.Font = new System.Drawing.Font("Times New Roman", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));<br />   this.textBox2.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.textBox2.Location = new System.Drawing.Point(325, 16);<br />   this.textBox2.Name = "textBox2";<br />   this.textBox2.Size = new System.Drawing.Size(104, 19);<br />   this.textBox2.TabIndex = 4;<br />   this.textBox2.Text = "";<br />   this.textBox2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;<br />   // <br />   // richTextBox1<br />   // <br />   this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;<br />   this.richTextBox1.ContextMenu = this.contextMenu1;<br />   this.richTextBox1.Location = new System.Drawing.Point(8, 368);<br />   this.richTextBox1.Name = "richTextBox1";<br />   this.richTextBox1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;<br />   this.richTextBox1.Size = new System.Drawing.Size(312, 96);<br />   this.richTextBox1.TabIndex = 5;<br />   this.richTextBox1.Text = "";<br />   this.richTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.richTextBox1_KeyDown);<br />   this.richTextBox1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.richTextBox1_KeyUp);<br />   // <br />   // richTextBox2<br />   // <br />   this.richTextBox2.BackColor = System.Drawing.SystemColors.InactiveCaptionText;<br />   this.richTextBox2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;<br />   this.richTextBox2.Location = new System.Drawing.Point(8, 48);<br />   this.richTextBox2.Name = "richTextBox2";<br />   this.richTextBox2.Size = new System.Drawing.Size(312, 280);<br />   this.richTextBox2.TabIndex = 6;<br />   this.richTextBox2.Text = "";<br />   // <br />   // label3<br />   // <br />   this.label3.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.label3.Location = new System.Drawing.Point(8, 336);<br />   this.label3.Name = "label3";<br />   this.label3.Size = new System.Drawing.Size(96, 24);<br />   this.label3.TabIndex = 8;<br />   this.label3.Text = "将要发送的内容";<br />   this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;<br />   // <br />   // label5<br />   // <br />   this.label5.AllowDrop = true;<br />   this.label5.AutoSize = true;<br />   this.label5.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.label5.Location = new System.Drawing.Point(8, 16);<br />   this.label5.Name = "label5";<br />   this.label5.Size = new System.Drawing.Size(42, 17);<br />   this.label5.TabIndex = 10;<br />   this.label5.Text = "收发：";<br />   this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;<br />   // <br />   // button2<br />   // <br />   this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;<br />   this.button2.ForeColor = System.Drawing.SystemColors.Menu;<br />   this.button2.Location = new System.Drawing.Point(256, 336);<br />   this.button2.Name = "button2";<br />   this.button2.Size = new System.Drawing.Size(64, 24);<br />   this.button2.TabIndex = 11;<br />   this.button2.Text = "浏览图片";<br />   this.button2.Visible = false;<br />   this.button2.Click += new System.EventHandler(this.button2_Click);<br />   // <br />   // pictureBox1<br />   // <br />   this.pictureBox1.BackColor = System.Drawing.SystemColors.Control;<br />   this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));<br />   this.pictureBox1.Location = new System.Drawing.Point(323, 48);<br />   this.pictureBox1.Name = "pictureBox1";<br />   this.pictureBox1.Size = new System.Drawing.Size(125, 152);<br />   this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;<br />   this.pictureBox1.TabIndex = 12;<br />   this.pictureBox1.TabStop = false;<br />   this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);<br />   this.pictureBox1.DoubleClick += new System.EventHandler(this.pictureBox1_DoubleClick);<br />   this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);<br />   // <br />   // openFileDialog1<br />   // <br />   this.openFileDialog1.Filter = "All file(*.*)|*.*";<br />   // <br />   // contextMenu1<br />   // <br />   this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {<br />                       this.menuItem1,<br />                       this.menuItem2,<br />                       this.menuItem3});<br />   // <br />   // menuItem1<br />   // <br />   this.menuItem1.Index = 0;<br />   this.menuItem1.Text = "复制(&amp;C)";<br />   this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);<br />   // <br />   // menuItem2<br />   // <br />   this.menuItem2.Index = 1;<br />   this.menuItem2.Text = "粘贴(&amp;P)";<br />   this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);<br />   // <br />   // menuItem3<br />   // <br />   this.menuItem3.Index = 2;<br />   this.menuItem3.Text = "剪切(&amp;T)";<br />   this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click);<br />   // <br />   // Form1<br />   // <br />   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);<br />   this.BackColor = System.Drawing.SystemColors.Desktop;<br />   this.ClientSize = new System.Drawing.Size(450, 470);<br />   this.Controls.Add(this.pictureBox1);<br />   this.Controls.Add(this.button2);<br />   this.Controls.Add(this.label5);<br />   this.Controls.Add(this.label3);<br />   this.Controls.Add(this.richTextBox2);<br />   this.Controls.Add(this.richTextBox1);<br />   this.Controls.Add(this.textBox2);<br />   this.Controls.Add(this.textBox1);<br />   this.Controls.Add(this.label2);<br />   this.Controls.Add(this.label1);<br />   this.Controls.Add(this.button1);<br />   this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;<br />   this.KeyPreview = true;<br />   this.MaximizeBox = false;<br />   this.Name = "Form1";<br />   this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;<br />   this.Text = "QQ-ZGG";<br />   this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);<br />   this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form1_KeyPress);<br />   this.Load += new System.EventHandler(this.Form1_Load);<br />   this.Closed += new System.EventHandler(this.Form1_Closed);<br />   this.ResumeLayout(false);</p>
		<p>  }<br />  #endregion</p>
		<p>  /// &lt;summary&gt;<br />  /// 应用程序的主入口点。<br />  /// &lt;/summary&gt;<br />  [STAThread]<br />  static void Main() <br />  {<br />   Application.Run(new Form1());<br />  }</p>
		<p>  private void button1_Click(object sender, System.EventArgs e)<br />  {<br />   try<br />   {<br />    System.Net.IPHostEntry ss = Dns.GetHostByAddress(textBox1.Text);<br />    label5.Text = ss.HostName.ToString();<br />   }<br />   catch(Exception er){<br />    MessageBox.Show("没有找到该主机名！");<br />   }<br />   if(textBox1.Text.Length &lt; 1 || textBox2.Text.Length &lt; 1 || richTextBox1.Text.Trim().Length &lt; 1){<br />    return;<br />   }<br />   try{<br /> <br />//    richTextBox1.Text = richTextBox1.Text.Substring(0,richTextBox1.TextLength - "\n".Length);<br />    string MyMessage = textBox2.Text + ":" + richTextBox1.Text + "\n";<br />    //根据目标计算机地址建立连接<br />    TcpClient MyTcpClient = new TcpClient(textBox1.Text,888);</p>
		<p>//    System.Net.Sockets.UdpClient MyUdpClient = new UdpClient(textBox1.Text,888);<br />    //获得用网络访问数据流<br />    NetworkStream MyTcpStream = MyTcpClient.GetStream();<br />    StreamWriter MyStream = new StreamWriter(MyTcpStream);<br />    //将字符串写入流<br />    MyStream.Write(MyMessage);<br />    //将缓冲数据写入基础流<br />    MyStream.Flush();<br />    //关闭网络流<br />    MyStream.Close();<br />    MyTcpClient.Close();<br />    richTextBox2.ReadOnly = false;<br />    richTextBox2.AppendText(textBox2.Text + ":"  + "\n" + richTextBox1.Text + "\n");<br />    richTextBox2.ReadOnly = true;<br />    richTextBox1.Clear();<br />    richTextBox1.Focus(); // 得到焦点<br />    <br />   }<br />   catch(Exception err){<br />    MessageBox.Show(err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);<br />   }<br />  }<br />  private void Key_Click(){<br />   if(textBox1.Text.Length &lt; 1 || textBox2.Text.Length &lt; 1 || richTextBox1.Text.Trim().Length &lt; 1)<br />   {<br />    return;<br />   }<br />   try<br />   {</p>
		<p>    richTextBox1.Text = richTextBox1.Text.Substring(0,richTextBox1.TextLength - "\n".Length);<br />    string MyMessage = textBox2.Text + ":" + richTextBox1.Text + "\n";<br />    //根据目标计算机地址建立连接<br />    TcpClient MyTcpClient = new TcpClient(textBox1.Text,888);</p>
		<p>    //    System.Net.Sockets.UdpClient MyUdpClient = new UdpClient(textBox1.Text,888);<br />    //获得用网络访问数据流<br />    NetworkStream MyTcpStream = MyTcpClient.GetStream();<br />    StreamWriter MyStream = new StreamWriter(MyTcpStream);<br />    //将字符串写入流<br />    MyStream.Write(MyMessage);<br />    //将缓冲数据写入基础流<br />    MyStream.Flush();<br />    //关闭网络流<br />    MyStream.Close();<br />    MyTcpClient.Close();<br />    richTextBox2.ReadOnly = false;<br />    richTextBox2.AppendText(textBox2.Text + ":"  + "\n" + richTextBox1.Text + "\n");<br />    richTextBox2.ReadOnly = true;<br />    richTextBox1.Clear();<br />    richTextBox1.Focus(); // 得到焦点<br />    <br />   }<br />   catch(Exception err)<br />   {<br />    MessageBox.Show(err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);<br />   }<br />  } </p>
		<p>  private void StartListen(){<br />   try<br />   {<br />    MyTcpListener = new TcpListener(888);</p>
		<p>    //开始监听<br />    MyTcpListener.Start();<br />    while(true)<br />    {<br />     //获取TcpClient<br />     TcpClient MyTcpClient = MyTcpListener.AcceptTcpClient();<br /> //    Socket s = MyTcpListener.AcceptSocket();<br />     NetworkStream MyStream = MyTcpClient.GetStream();<br />     Byte[] MyBytes = new Byte[1024];<br />     int MyByteRead = MyStream.Read(MyBytes,0,MyBytes.Length); <br />     string MyMessage = System.Text.Encoding.UTF8.GetString(MyBytes,0,MyByteRead);<br />     textBox1.Text = MyMessage.Substring(0,MyMessage.LastIndexOf(":"));<br />     this.Text = "QQ-ZGG:" + "来自" + textBox1.Text + "的呼叫！";<br />     richTextBox2.ReadOnly = false;<br />     richTextBox2.Text += MyMessage;<br />     richTextBox2.ReadOnly = true;<br />　　　　　　　　　　　<br />　　　　　　 }<br />   }<br />   catch(Exception err){<br />    Console.WriteLine(err.Message);<br />   }</p>
		<p>    <br />  }</p>
		<p>  private void Form1_Load(object sender, System.EventArgs e)<br />  {<br />   //开始监听<br />   //创建监听线程<br />   <br />   string LocalHost = Dns.GetHostName();<br />   <br />   textBox2.Text = LocalHost;<br />   textBox2.ReadOnly = true;<br />   MyListenThread = new Thread(new ThreadStart(StartListen));<br />   //启动线程<br />   MyListenThread.Start();</p>
		<p>  }</p>
		<p>  private void Form1_Closed(object sender, System.EventArgs e)<br />  {<br />   try<br />   {<br />    if(MyTcpListener!=null){<br />     //关闭监听器<br />     MyTcpListener.Stop();<br />    }<br />    if(MyListenThread != null){<br />     if(MyListenThread.ThreadState == ThreadState.Running)<br />     {<br />      MyListenThread.Abort();<br />     }<br />    }<br />   }<br />   catch(Exception err){<br />    MessageBox.Show(err.Message,"信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);<br />   }<br />  }</p>
		<p>  private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)<br />  {<br />   <br />  }</p>
		<p>  private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)<br />  {//使用快捷组合键<br />   <br />  }</p>
		<p>  private void button2_Click(object sender, System.EventArgs e)<br />  {<br />    if(openFileDialog1.ShowDialog() == DialogResult.OK)<br />     pictureBox1.Image = System.Drawing.Bitmap.FromFile(openFileDialog1.FileName);<br />  }</p>
		<p>  private void richTextBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)<br />  {<br />   if(e.Control == true)<br />   { <br />    switch (e.KeyCode)<br />    {<br />      <br />     case Keys.Enter:<br />//      richTextBox1.Text = richTextBox1.Text + "\n";<br />      Key_Click();<br />      <br />      break;<br />     default: break;<br />    }<br />    <br />   }<br />  }</p>
		<p>  private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)<br />  {<br />   <br />  }</p>
		<p>  private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)<br />  {<br />   <br />  }</p>
		<p>  private void pictureBox1_Click(object sender, System.EventArgs e)<br />  {<br />   <br />  }</p>
		<p>  private void pictureBox1_DoubleClick(object sender, System.EventArgs e)<br />  {<br />//   if(button2.Visible == false)<br />//    button2.Visible = true;<br />//   else<br />//    button2.Visible = false;<br />   button2_Click(sender,e);<br />  }</p>
		<p>  private void menuItem1_Click(object sender, System.EventArgs e)<br />  {<br />   //copy <br />   richTextBox1.Copy();<br />  }</p>
		<p>  private void menuItem3_Click(object sender, System.EventArgs e)<br />  {<br />   richTextBox1.Cut();<br />  }</p>
		<p>  private void menuItem2_Click(object sender, System.EventArgs e)<br />  {<br />   richTextBox1.Paste();<br />  }</p>
		<p>
				<br /> }<br />}<br /></p>
<img src ="http://www.blogjava.net/zgghc/aggbug/118895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-05-21 15:46 <a href="http://www.blogjava.net/zgghc/articles/118895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用C#实现基于用C#实现基于TCP协议的网络通讯</title><link>http://www.blogjava.net/zgghc/articles/118893.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 21 May 2007 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/118893.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/118893.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/118893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/118893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/118893.html</trackback:ping><description><![CDATA[
		<p>TCP协议是一个基本的网络协议，基本上所有的网络服务都是基于TCP协议的，如HTTP,FTP等等，所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系，要彻底的弄清楚它的实现不是一天两天的功夫，所幸的是在.net framework环境下，我们不必要去追究TCP协议底层的实现，一样可以很方便的编写出基于TCP协议进行网络通讯的程序。 </p>
		<p>要进行基于TCP协议的网络通讯，首先必须建立同远程主机的连接，连接地址通常包括两部分——主机名和端口，如<a href="http://www.yesky.com:80">www.yesky.com:80</a>中，<a href="http://www.yesky.com">www.yesky.com</a>就是主机名，80指主机的80端口，当然，主机名也可以用IP地址代替。当连接建立之后，就可以使用这个连接去发送和接收数据包，TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来。 </p>
		<p>在.net framework的类库（Class Library）中，提供了两个用于TCP网络通讯的类，分别是TcpClient和TcpListener。由其英文意义显而易见，TcpClient类是基于TCP协议的客户端类，而TcpListener是服务器端，监听(Listen)客户端传来的连接请求。TcpClient类通过TCP协议与服务器进行通讯并获取信息，它的内部封装了一个Socket类的实例，这个Socket对象被用来使用TCP协议向服务器请求和获取数据。因为与远程主机的交互是以数据流的形式出现的，所以传输的数据可以使用.net framework中流处理技术读写。在我们下边的例子中，你可以看到使用NetworkStream类操作数据流的方法。 </p>
		<p>在下面的例子中，我们将建立一个时间服务器，包括服务器端程序和客户端程序。服务器端监听客户端的连接请求，建立连接以后向客户端发送当前的系统时间。 </p>
		<p>先运行服务器端程序，下面截图显示了服务器端程序运行的状况： </p>
		<p>
				<br />然后运行客户端程序，客户端首先发送连接请求到服务器端，服务器端回应后发送当前时间到客户端，这是客户端程序的截图： </p>
		<p>
				<br />发送完成后，服务器端继续等待下一次连接： </p>
		<p>
				<br />通过这个例子我们可以了解TcpClient类的基本用法，要使用这个类，必须使用System.Net.Socket命名空间，本例用到的三个命名空间如下： </p>
		<p>using System; <br />using System.Net.Sockets; <br />using System.Text;//从字节数组中获取字符串时使用该命名空间中的类 </p>
		<p>首先讨论一下客户端程序，开始我们必须初始化一个TcpClient类的实例： </p>
		<p>TcpClient client = new TcpClient(hostName, portNum); </p>
		<p>然后使用TcpClient类的GetStream()方法获取数据流，并且用它初始化一个NetworkStream类的实例： </p>
		<p>NetworkStream ns = client.GetStream(); </p>
		<p>注意，当使用主机名和端口号初始化TcpClient类的实例时，直到跟服务器建立了连接，这个实例才算真正建立，程序才能往下执行。如果因为网络不通，服务器不存在，服务器端口未开放等等原因而不能连接，程序将抛出异常并且中断执行。 </p>
		<p>建立数据流之后，我们可以使用NetworkStream类的Read()方法从流中读取数据，使用Write()方法向流中写入数据。读取数据时，首先应该建立一个缓冲区，具体的说，就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下： </p>
		<p>public override int Read(in byte[] buffer,int offset,int size) </p>
		<p>buffer是缓冲数组，offset是数据（字节流）在缓冲数组中存放的开始位置，size是读取的字节数目，返回值是读取的字节数。在本例中，简单地使用该方法来读取服务器反馈的信息： </p>
		<p>byte[] bytes = new byte[1024];//建立缓冲区 <br />int bytesRead = ns.Read(bytes, 0, bytes.Length);//读取字节流 </p>
		<p>然后显示到屏幕上： </p>
		<p>Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead)); </p>
		<p>最后不要忘记关闭连接： </p>
		<p>client.Close(); </p>
		<p>下面是本例完整的程序清单： </p>
		<p>using System; <br />using System.Net.Sockets; <br />using System.Text; </p>
		<p>namespace TcpClientExample <br />{ <br />public class TcpTimeClient <br />{ <br />private const int portNum = 13;//服务器端口，可以随意修改 <br />private const string hostName = "127.0.0.1";//服务器地址，127.0.0.1指本机 </p>
		<p>[STAThread] <br />static void Main(string[] args) <br />{ <br />try <br />{ <br />Console.Write("Try to connect to "+hostName+":"+portNum.ToString()+"\r\n"); <br />TcpClient client = new TcpClient(hostName, portNum); <br />NetworkStream ns = client.GetStream(); <br />byte[] bytes = new byte[1024]; <br />int bytesRead = ns.Read(bytes, 0, bytes.Length); </p>
		<p>Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead)); </p>
		<p>client.Close(); <br />Console.ReadLine();//由于是控制台程序，故为了清楚的看到结果，可以加上这句 </p>
		<p>} <br />catch (Exception e) <br />{ <br />Console.WriteLine(e.ToString()); <br />} <br />} <br />} <br />} </p>
		<p>上面这个例子清晰地演示了客户端程序的编写要点，下面我们讨论一下如何建立服务器程序。这个例子将使用TcpListener类，在13号端口监听，一旦有客户端连接，将立即向客户端发送当前服务器的时间信息。 </p>
		<p>TcpListener的关键在于AcceptTcpClient()方法，该方法将检测端口是否有未处理的连接请求，如果有未处理的连接请求，该方法将使服务器同客户端建立连接，并且返回一个TcpClient对象，通过这个对象的GetStream方法建立同客户端通讯的数据流。事实上，TcpListener类还提供一个更为灵活的方法AcceptSocket()，当然灵活的代价是复杂，对于比较简单的程序，AcceptTcpClient()已经足够用了。此外，TcpListener类提供Start()方法开始监听，提供Stop()方法停止监听。 </p>
		<p>首先我们使用端口初始化一个TcpListener实例，并且开始在13端口监听： </p>
		<p>private const int portNum = 13; <br />TcpListener listener = new TcpListener(portNum); <br />listener.Start();//开始监听 </p>
		<p>如果有未处理的连接请求，使用AcceptTcpClient方法进行处理，并且获取数据流： </p>
		<p>TcpClient client = listener.AcceptTcpClient(); <br />NetworkStream ns = client.GetStream(); </p>
		<p>然后，获取本机时间，并保存在字节数组中，使用NetworkStream.Write()方法写入数据流，然后客户端就可以通过Read()方法从数据流中获取这段信息： </p>
		<p>byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString()); <br />ns.Write(byteTime, 0, byteTime.Length); <br />ns.Close();//不要忘记关闭数据流和连接 <br />client.Close(); </p>
		<p>服务器端程序完整的程序清单如下： </p>
		<p>using System; <br />using System.Net.Sockets; <br />using System.Text; </p>
		<p>
				<br />namespace TimeServer <br />{ <br />class TimeServer <br />{ <br />private const int portNum = 13; </p>
		<p>[STAThread] <br />static void Main(string[] args) <br />{ <br />bool done = false; <br />TcpListener listener = new TcpListener(portNum); <br />listener.Start(); <br />while (!done) <br />{ <br />Console.Write("Waiting for connection..."); <br />TcpClient client = listener.AcceptTcpClient(); </p>
		<p>Console.WriteLine("Connection accepted."); <br />NetworkStream ns = client.GetStream(); </p>
		<p>byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString()); </p>
		<p>try <br />{ <br />ns.Write(byteTime, 0, byteTime.Length); <br />ns.Close(); <br />client.Close(); <br />} <br />catch (Exception e) <br />{ <br />Console.WriteLine(e.ToString()); <br />} <br />} </p>
		<p>listener.Stop(); <br />} <br />} <br />} </p>
		<p>把上面两段程序分别编译运行，OK，我们已经用C#实现了基于TCP协议的网络通讯，怎么样？很简单吧！ </p>
		<p>使用上面介绍的基本方法，我们可以很容易的编写出一些很有用的程序，如FTP，电子邮件收发，点对点即时通讯等等，你甚至可以自己编制一个QQ来！   </p>
<img src ="http://www.blogjava.net/zgghc/aggbug/118893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-05-21 15:41 <a href="http://www.blogjava.net/zgghc/articles/118893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#.net常用函数和方法集</title><link>http://www.blogjava.net/zgghc/articles/111850.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 19 Apr 2007 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/111850.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/111850.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/111850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/111850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/111850.html</trackback:ping><description><![CDATA[
		<font face="宋体"> </font>
		<div class="postTitle">
				<strong>1、DateTime 数字型 </strong>
				<br />System.DateTime currentTime=new System.DateTime(); <br />1.1 取当前年月日时分秒 <br />currentTime=System.DateTime.Now; <br />1.2 取当前年 <br />int 年=currentTime.Year; <br />1.3 取当前月 <br />int 月=currentTime.Month; <br />1.4 取当前日 <br />int 日=currentTime.Day; <br />1.5 取当前时 <br />int 时=currentTime.Hour; <br />1.6 取当前分 <br />int 分=currentTime.Minute; <br />1.7 取当前秒 <br />int 秒=currentTime.Second; <br />1.8 取当前毫秒 <br />int 毫秒=currentTime.Millisecond; <br />（变量可用中文） </div>
		<div class="postText">
				<p>
						<strong>2、Int32.Parse(变量) Int32.Parse("常量") </strong>
						<br />字符型转换 转为32位数字型 </p>
				<p>
						<strong>3、 变量.ToString() <br /></strong>字符型转换 转为字符串 <br />12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% </p>
				<p>
						<br />
						<strong>4、变量.Length 数字型 </strong>
						<br />取字串长度： <br />如： string str="中国"; <br />int Len = str.Length ; //Len是自定义变量， str是求测的字串的变量名 </p>
				<p>
						<strong>5、System.Text.Encoding.Default.GetBytes(变量) <br /></strong>字码转换 转为比特码 <br />如：byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); <br />然后可得到比特长度： <br />len = bytStr.Length; </p>
				<p>
						<strong>6、System.Text.StringBuilder("") </strong>
						<br />字符串相加，（+号是不是也一样？） <br />如：System.Text.StringBuilder sb = new System.Text.StringBuilder(""); <br />sb.Append("中华"); <br />sb.Append("人民"); <br />sb.Append("共和国"); </p>
				<p>
						<strong>7、变量.Substring(参数1,参数2); <br /></strong>截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br />如：string s1 = str.Substring(0,2); </p>
				<p>
						<strong>8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); </strong>
						<br />取远程用户IP地址 </p>
				<p>
						<strong>9、穿过代理服务器取远程用户真实IP地址： <br /></strong>if(Request.ServerVariables["HTTP_VIA"]!=null){ <br />string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); <br />}else{ <br />string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />} <br /><br /><strong>10、 Session["变量"]; </strong><br />存取Session值； <br />如，赋值： Session["username"]="小布什"; </p>
				<p>取值： Object objName=Session["username"]; <br />String strName=objName.ToString(); <br />清空： Session.RemoveAll(); </p>
				<p>
						<strong>11、String str=Request.QueryString["变量"]; </strong>
						<br />用超链接传送变量。 <br />如在任一页中建超链接:&lt;a href=Edit.aspx?fbid=23&gt;点击&lt;/a&gt; <br />在Edit.aspx页中取值：String str=Request.QueryString["fdid"]; </p>
				<p>
						<strong>12、DOC对象.CreateElement("新建节点名"); </strong>
						<br />创建XML文档新节点 </p>
				<p>
						<strong>13、父节点.AppendChild(子节点)； </strong>
						<br />将新建的子节点加到XML文档父节点下 </p>
				<p>
						<strong>14、 父节点.RemoveChild(节点); </strong>
						<br />删除节点 </p>
				<p>
						<strong>15、Response </strong>
						<br />Response.Write("字串")； <br />Response.Write(变量)； <br />向页面输出。 </p>
				<p>Response.Redirect("URL地址"）； <br />跳转到URL指定的页面 </p>
				<p>
						<strong>16、char.IsWhiteSpce(字串变量，位数)——逻辑型 </strong>
						<br />查指定位置是否空字符； <br />如： <br />string str="中国 人民"; <br />Response.Write(char.IsWhiteSpace(str,2)); //结果为：True, 第一个字符是0位，2是第三个字符。 </p>
				<p>
						<strong>17、char.IsPunctuation('字符') --逻辑型 </strong>
						<br />查字符是否是标点符号 <br />如：Response.Write(char.IsPunctuation('A')); //返回：False </p>
				<p>
						<strong>18、(int)'字符' <br /></strong>把字符转为数字，查代码点，注意是单引号。 <br />如： <br />Response.Write((int)'中'); //结果为中字的代码：20013 </p>
				<p>
						<strong>19、(char)代码 <br /></strong>把数字转为字符，查代码代表的字符。 <br />如： <br />Response.Write((char)22269); //返回“国”字。 <br /><br /><strong>20、 Trim() <br /></strong>清除字串前后空格 </p>
				<p>
						<strong>21 、字串变量.Replace("子字串","替换为") </strong>
						<br />字串替换 <br />如： <br />string str="中国"; <br />str=str.Replace("国","央"); //将国字换为央字 <br />Response.Write(str); //输出结果为“中央” </p>
				<p>再如：（这个非常实用） </p>
				<p>string str="这是&lt;script&gt;脚本"; <br />str=str.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); //将左尖括号替换为&lt;font&gt; 与 &lt; 与 &lt;/font&gt; （或换为&lt;，但估计经XML存诸后，再提出仍会还原） <br />Response.Write(str); //显示为：“这是&lt;script&gt;脚本” </p>
				<p>如果不替换，&lt;script&gt;将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。 <br />这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。 <br />具体实现：将你的表单提交按钮脚本加上下面代码： <br />string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 <br />strSubmit=strSubmit.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); <br />然后保存或输出strSubmit。 <br />用此方法还可以简单实现UBB代码。 </p>
				<p>
						<strong>22、Math.Max(i,j) </strong>
						<br />取i与j中的最大值 <br />如 int x=Math.Max(5,10); // x将取值 10 </p>
				<p>加一点吧 23、字串对比...... <br />加一点吧 </p>
				<p>
						<strong>23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </strong>
				</p>
				<p>(1)、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </p>
				<p>(2)、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>(3)、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>
						<strong>24、IndexOf() 、LastIndexOf() </strong>
						<br />查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </p>
				<p>
						<strong>25、Insert() </strong>
						<br />在字串中指定索引位插入指定字符。如： <br />str1.Insert(1,"字");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”； </p>
				<p>
						<strong>26、PadLeft()、PadRight() </strong>
						<br />在字串左（或右）加空格或指定char字符，使字串达到指定长度，如： <br />&lt;% <br />string str1="中国人"; <br />str1=str1.PadLeft(10,'1'); //无第二参数为加空格 <br />Response.Write(str1); //结果为“1111111中国人” ， 字串长为10 <br />%&gt; </p>
				<p>
						<strong>27、Remove() </strong>
						<br />从指定位置开始删除指定数的字符 <br />字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </p>
				<p>1、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </p>
				<p>2、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>3、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>IndexOf() <br />查找字串中指定字符或字串首次出现的位置,返首索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </p>
				<p>1.9 取中文日期显示——年月日时分 <br />string strY=currentTime.ToString("f"); //不显示秒 </p>
				<p>1.10 取中文日期显示_年月 <br />string strYM=currentTime.ToString("y"); </p>
				<p>1.11 取中文日期显示_月日 <br />string strMD=currentTime.ToString("m"); </p>
				<p>1.12 取当前年月日，格式为：2003-9-23 <br />string strYMD=currentTime.ToString("d"); </p>
				<p>1.13 取当前时分，格式为：14：24 <br />string strT=currentTime.ToString("t"); <br />更新一下， 上面不能编辑： </p>
				<p>
						<strong>
								<u>c#.net函数和方法集(大家一起来加啊) </u>
						</strong>
				</p>
				<p>
						<br />
						<strong>1、DateTime 数字型 </strong>
						<br />System.DateTime currentTime=new System.DateTime(); <br />1.1 取当前年月日时分秒 <br />currentTime=System.DateTime.Now; <br />1.2 取当前年 <br />int 年=currentTime.Year; <br />1.3 取当前月 <br />int 月=currentTime.Month; <br />1.4 取当前日 <br />int 日=currentTime.Day; <br />1.5 取当前时 <br />int 时=currentTime.Hour; <br />1.6 取当前分 <br />int 分=currentTime.Minute; <br />1.7 取当前秒 <br />int 秒=currentTime.Second; <br />1.8 取当前毫秒 <br />int 毫秒=currentTime.Millisecond; <br />（变量可用中文） </p>
				<p>1.9 取中文日期显示——年月日时分 <br />string strY=currentTime.ToString("f"); //不显示秒 </p>
				<p>1.10 取中文日期显示_年月 <br />string strYM=currentTime.ToString("y"); </p>
				<p>1.11 取中文日期显示_月日 <br />string strMD=currentTime.ToString("m"); </p>
				<p>1.12 取中文年月日 <br />string strYMD=currentTime.ToString("D"); </p>
				<p>1.13 取当前时分，格式为：14：24 <br />string strT=currentTime.ToString("t"); </p>
				<p>1.14 取当前时间，格式为：2003-09-23T14:46:48 <br />string strT=currentTime.ToString("s"); </p>
				<p>1.15 取当前时间，格式为：2003-09-23 14:48:30Z <br />string strT=currentTime.ToString("u"); </p>
				<p>1.16 取当前时间，格式为：2003-09-23 14:48 <br />string strT=currentTime.ToString("g"); <br /><br />1.17 取当前时间，格式为：Tue, 23 Sep 2003 14:52:40 GMT <br />string strT=currentTime.ToString("r"); </p>
				<p>1.18获得当前时间 n 天后的日期时间 <br />DateTime newDay = DateTime.Now.AddDays(100); </p>
				<p>
						<strong>2、Int32.Parse(变量) Int32.Parse("常量") <br /></strong>字符型转换 转为32位数字型 </p>
				<p>
						<strong>3、 变量.ToString() </strong>
						<br />字符型转换 转为字符串 <br />12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% </p>
				<p>
						<br />
						<strong>4、变量.Length 数字型 </strong>
						<br />取字串长度： <br />如： string str="中国"; <br />int Len = str.Length ; //Len是自定义变量， str是求测的字串的变量名 </p>
				<p>
						<strong>5、System.Text.Encoding.Default.GetBytes(变量) </strong>
						<br />字码转换 转为比特码 <br />如：byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); <br />然后可得到比特长度： <br />len = bytStr.Length; </p>
				<p>
						<strong>6、System.Text.StringBuilder("") </strong>
						<br />字符串相加，（+号是不是也一样？） <br />如：System.Text.StringBuilder sb = new System.Text.StringBuilder(""); <br />sb.Append("中华"); <br />sb.Append("人民"); <br />sb.Append("共和国"); </p>
				<p>
						<strong>7、变量.Substring(参数1,参数2); </strong>
						<br />截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br />如：string s1 = str.Substring(0,2); </p>
				<p>
						<strong>8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); </strong>
						<br />取<strong>远程用户IP地址 </strong></p>
				<p>
						<strong>9、穿过代理服务器取远程用户真实IP地址： <br /></strong>if(Request.ServerVariables["HTTP_VIA"]!=null){ <br />string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); <br />}else{ <br />string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />} <br /><br /><strong>10、 Session["变量"]; </strong><br />存取Session值； <br />如，赋值： Session["username"]="小布什"; </p>
				<p>取值： Object objName=Session["username"]; <br />String strName=objName.ToString(); <br />清空： Session.RemoveAll(); </p>
				<p>
						<strong>11、String str=Request.QueryString["变量"]; <br /></strong>用超链接传送变量。 <br />如在任一页中建超链接:&lt;a href=Edit.aspx?fbid=23&gt;点击&lt;/a&gt; <br />在Edit.aspx页中取值：String str=Request.QueryString["fdid"]; </p>
				<p>
						<strong>12、DOC对象.CreateElement("新建节点名"); </strong>
						<br />创建XML文档新节点 </p>
				<p>
						<strong>13、父节点.AppendChild(子节点)； <br /></strong>将新建的子节点加到XML文档父节点下 </p>
				<p>
						<strong>14、 父节点.RemoveChild(节点); </strong>
						<br />删除节点 </p>
				<p>
						<strong>15、Response </strong>
						<br />Response.Write("字串")； <br />Response.Write(变量)； <br />向页面输出。 </p>
				<p>Response.Redirect("URL地址"）； <br />跳转到URL指定的页面 </p>
				<p>
						<strong>16、char.IsWhiteSpce(字串变量，位数)——逻辑型 </strong>
						<br />查指定位置是否空字符； <br />如： <br />string str="中国 人民"; <br />Response.Write(char.IsWhiteSpace(str,2)); //结果为：True, 第一个字符是0位，2是第三个字符。 </p>
				<p>
						<strong>17、char.IsPunctuation('字符') --逻辑型 </strong>
						<br />查字符是否是标点符号 <br />如：Response.Write(char.IsPunctuation('A')); //返回：False </p>
				<p>
						<strong>18、(int)'字符' </strong>
						<br />把字符转为数字，查代码点，注意是单引号。 <br />如： <br />Response.Write((int)'中'); //结果为中字的代码：20013 </p>
				<p>
						<strong>19、(char)代码 <br /></strong>把数字转为字符，查代码代表的字符。 <br />如： <br />Response.Write((char)22269); //返回“国”字。 <br /><br /><strong>20、 Trim() <br /></strong>清除字串前后空格 </p>
				<p>
						<strong>21 、字串变量.Replace("子字串","替换为") </strong>
						<br />字串替换 <br />如： <br />string str="中国"; <br />str=str.Replace("国","央"); //将国字换为央字 <br />Response.Write(str); //输出结果为“中央” </p>
				<p>再如：（这个非常实用） </p>
				<p>string str="这是&lt;script&gt;脚本"; <br />str=str.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); //将左尖括号替换为&lt;font&gt; 与 &lt; 与 &lt;/font&gt; （或换为&lt;，但估计经XML存诸后，再提出仍会还原） <br />Response.Write(str); //显示为：“这是&lt;script&gt;脚本” </p>
				<p>如果不替换，&lt;script&gt;将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。 <br />这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。 <br />具体实现：将你的表单提交按钮脚本加上下面代码： <br />string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 <br />strSubmit=strSubmit.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); <br />然后保存或输出strSubmit。 <br />用此方法还可以简单实现UBB代码。 </p>
				<p>
						<strong>22、Math.Max(i,j) <br /></strong>取i与j中的最大值 <br />如 int x=Math.Max(5,10); // x将取值 10 </p>
				<p>
						<strong>23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </strong>
				</p>
				<p>(1)、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </p>
				<p>(2)、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>(3)、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </p>
				<p>
						<strong>24、IndexOf() 、LastIndexOf() </strong>
						<br />查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </p>
				<p>
						<strong>25、Insert() </strong>
						<br />在字串中指定索引位插入指定字符。如： <br />str1.Insert(1,"字");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”； </p>
				<p>
						<strong>26、PadLeft()、PadRight() <br /></strong>在字串左（或右）加空格或指定char字符，使字串达到指定长度，如： <br />&lt;% <br />string str1="中国人"; <br />str1=str1.PadLeft(10,'1'); //无第二参数为加空格 <br />Response.Write(str1); //结果为“1111111中国人” ， 字串长为10 <br />%&gt; </p>
				<p>
						<strong>27、Remove() </strong>
						<br />从指定位置开始删除指定数的字符 <br />&lt;% <br />string str1="我是萨达姆的崇拜者之一"; <br />Response.Write(str1.Remove(5,4)); //结果为“我是萨达姆之一” <br />%&gt; </p>
		</div>
<img src ="http://www.blogjava.net/zgghc/aggbug/111850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-04-19 10:03 <a href="http://www.blogjava.net/zgghc/articles/111850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>路径，文件，目录，I/O常见操作汇总（二） </title><link>http://www.blogjava.net/zgghc/articles/111840.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 19 Apr 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/111840.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/111840.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/111840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/111840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/111840.html</trackback:ping><description><![CDATA[
		<strong>摘要:<br /></strong>    文件操作是程序中非常基础和重要的内容，而路径、文件、目录以及I/O都是在进行文件操作时的常见主题，这里想把这些常见的问题作个总结，对于每个问题，尽量提供一些解决方案，即使没有你想要的答案，也希望能提供给你一点有益的思路，如果你有好的建议，恳请能够留言，使这些内容更加完善。 <br />    主要内容：<br />    一、路径的相关操作， 如判断路径是否合法，路径类型，路径的特定部分，合并路径，系统文件夹路径等内容；<br />    二、相关通用文件对话框，这些对话框可以帮助我们操作文件系统中的文件和目录；<br />    三、文件、目录、驱动器的操作，如获取它们的基本信息，获取和设置文件和目录的属性，文件的版本信息，<br />        搜索文件和目录，文件判等，复制、移动、删除、重命名文件和目录；<br />    四、读写文件，包括临时文件，随机文件名等；<br />    五、对文件系统的监视；<br /><br />    <a title="路径的相关操作" style="COLOR: #e210ff" href="http://www.cnblogs.com/anderslly/archive/2006/12/24/pathcommondialog.html" target="_blank">上一篇</a>介绍了第一、二部分，这一篇介绍一下最重要的第三部分。<br />    <br />    <span style="FONT-WEIGHT: bold">三、文件和目录相关操作</span><br />    文件和目录操作涉及的类主要是：FileInfo,DirectoryInfo,DriveInfo，可以认为它们的一个实例对应着一个文件、目录、驱动器。它们的用法类似，一般是将文件、目录或驱动器的路径作为参数传递给相应的构造函数创建一个实例，然后访问它们的属性和方法。<br />    注意下面几点：<br />    FileInfo 类和 DirectoryInfo 类都继承自抽象类 FileSystemInfo ， FileSystemInfo 类定义了一些通用的属性，如 CreationTime 、 Exists 等。但 DriveInfo 类没有继承 FileSystemInfo 类，所以它也就没有上面提到的那些通用属性了。<br /><br />    FileInfo 类和 DirectoryInfo 类的对象公开的属性值都是第一次查询时获取的值，如果在以此查询之后文件或目录发生了改动，就必须调用它们的 Refresh 方法来更新这些属性。但 DriveInfo 则无需这么做，它的属性每次都会读取文件系统最新的信息。<br /><br />    在创建文件、目录或驱动器的实例时，如果使用了一个不存在的路径，并不会报错，这是你得到一个对象，该对象表示一个并不存在的实体，这意味着它的 Exists 属性（对于 DriveInfo 来说是 IsReady 属性）值为 false 。你仍然可以操作该实体，但如果尝试其它的大多数属性，就会引发相应的 FileNotFoundException 、 DirectoryNotFoundException 或 DriveNotFoundException 异常。<br /><br />    另外，还可以使用 File / Directory 类，这两个类的成员都是静态方法，<span style="COLOR: #ff2074">所以如果只想执行一个操作</span>，那么使用 File/Directory 中的静态方法的效率比使用相应的 FileInfo / DirectoryInfo中的 实例方法可能更高。所有的 File / Directory 方法都要求当前所操作的文件 / 目录的路径。 注意： File / Directory 类的静态方法对所有方法都执行安全检查。<span style="COLOR: #ff2074">如果打算多次重用某个对象</span>，可考虑改用 FileInfo / DirectoryInfo 的相应实例方法，因为并不总是需要安全检查。   
<p>    下面是一些常见的问题：<br />    问题1：<span style="COLOR: #2000ff">如何获取指定文件的基本信息；</span><br />    解决方案：可以使用FileInfo类的相关属性：<br />    FileInfo.Exists：获取指定文件是否存在；<br />    FileInfo.Name，FileInfo.Extensioin：获取文件的名称和扩展名；<br />    FileInfo.FullName：获取文件的全限定名称（完整路径）；<br />    FileInfo.Directory：获取文件所在目录，返回类型为DirectoryInfo；<br />    FileInfo.DirectoryName：获取文件所在目录的路径（完整路径）；<br />    FileInfo.Length：获取文件的大小（字节数）；<br />    FileInfo.IsReadOnly：获取文件是否只读；<br />    FileInfo.Attributes：获取或设置指定文件的属性，返回类型为FileAttributes枚举，可以是多个值的组合（见问题2）；<br />    FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime：分别用于获取文件的创建时间、访问时间、修改时间；<br />    （更多内容还请参考MSDN）<br /></p><p>    问题2：<span style="COLOR: #2000ff">如何获取和设置文件的属性，比如只读、存档、隐藏等；</span><br />    解决方案：<br />    使用FileInfo.Attributes属性可以获取和设置文件的属性，该属性类型为FileAttributes枚举，该枚举的每个值表示一种属性，FileAttributes枚举具有属性（Attribute）FlagsAttribute，所以该枚举的值可以进行组合，也就是一个文件可以同时拥有多个属性。下面看看具体的做法：<br />    获取属性，比如判断一个文件是否是只读的：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 当文件具有其它属性时，这种做法会失败</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (file.Attributes </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> FileAttributes.ReadOnly)<br />    {<br />        chkReadonly.Checked </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    }<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 这种写法就不会有问题了，它只检查只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ((file.Attributes </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> FileAttributes.ReadOnly) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> FileAttributes.ReadOnly)<br />    {<br />        chkReadonly.Checked </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    }</span></div><br /><p>    设置属性，比如添加和移除一个文件的只读属性：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (chkReadonly.Checked)<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 添加只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        file.Attributes </span><span style="COLOR: #000000">|=</span><span style="COLOR: #000000"> FileAttributes.ReadOnly;<br />    }<br />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 移除只读属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        file.Attributes </span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">FileAttributes.ReadOnly;<br />    }</span></div><p>    问题3：<span style="COLOR: #2000ff">如何获取文件的版本信息（比如版本号，版权声明，公司名称等）；</span><br />    解决方案：<br />    使用FileVersionInfo类，该类有大量的版本信息相关的属性。通过它的静态方法GetVersionInfo获得该类的一个实例，然后就可以访问指定文件的版本信息了，非常方便。如FileVersion表示文件版本号，LegalCopyright表示指定文件的版权声明，CompanyName表示指定文件的公司名称。（更多内容还请参考MSDN）</p><p>    问题4：<span style="COLOR: #2000ff">如何判断两个文件的内容是否相同（精确匹配）；</span><br />    解决方案：<br />    使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码，然后比较两个哈希码是否一致。<br />    在比较文件内容的时候可以采用好几种方法。例如，检查文件的某一特定部分是否一致；如果愿意，你甚至可以逐字节读取文件，逐字节进行比较。这两种方法都是可以的，但在某些情况下，还是使用哈希码算法更为方便。<br />    该算法为一个文件生成一个小的（通常约为20字节）二进制”指纹”（binary fingerprint）。从统计学角度看，不同的文件不可能生成相同的哈希码。事实上，即使是一个很小的改动（比如，修改了源文件中的一个bit），也会有50％的几率来改变哈希码中的每一个bit。因此，哈希码常常用于数据安全方面。<br />    要生成一个哈希码，你必须首先创建一个HashAlgorithm对象，而这通常是调用HashAlgorithm.Create方法来完成的；然后调用HashAlgorithm.ComputeHash方法，它会返回一个存储哈希码的字节数组。代码如下：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 判断两个文件内容是否一致<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> IsFilesEqual(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName1, </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName2)<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (HashAlgorithm hashAlg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> HashAlgorithm.Create())<br />        {<br />            </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName1, FileMode.Open), fs2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName2, FileMode.Open))<br />            {<br />                </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashBytes1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hashAlg.ComputeHash(fs1);<br />                </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] hashBytes2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hashAlg.ComputeHash(fs2);<br /><br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 比较哈希码</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (BitConverter.ToString(hashBytes1) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> BitConverter.ToString(hashBytes2));<br />            }<br />        }<br />    }</span></div><br /><p>    问题5：<span style="COLOR: #2000ff">如何获取指定目录的基本信息；</span><br />    解决方案：可以使用DirectoryInfo类的相关属性和方法：<br />    DirectoryInfo.Exists：获取指定目录是否存在；<br />    DirectoryInfo.Name：获取目录的名称；<br />    DirectoryInfo.FullName：获取目录的全限定名称（完整路径）；<br />    DirectoryInfo.Attributes：获取或设置指定目录的属性，返回类型为FileAttributes枚举，可以是多个值的组合；   <br />    DirectoryInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime：分别用于获取目录的创建时间、访问时间、修改时间；<br />    DirectoryInfo.Parent：获取目录的上级目录，返回类型为DirectoryInfo；<br />    DirectoryInfo.Root：获取目录的根目录，返回类型为DirectoryInfo；<br /></p><p>    问题6：<span style="COLOR: #2000ff">如何获取指定目录包含的文件和子目录；</span><br />    解决方案：<br />    DirectoryInfo.GetFiles()：获取目录中（不包含子目录）的文件，返回类型为FileInfo[]，支持通配符查找；<br />    DirectoryInfo.GetDirectories()：获取目录（不包含子目录）的子目录，<br />        返回类型为DirectoryInfo[]，支持通配符查找；<br />    DirectoryInfo. GetFileSystemInfos()：获取指定目录下（不包含子目录）的文件和子目录，<br />        返回类型为FileSystemInfo[]，支持通配符查找；<br /></p><p>    问题7：<span style="COLOR: #2000ff">如何获得指定目录的大小；</span><br />    解决方案：<br />    检查目录内的所有文件，利用FileInfo.Length属性获取每个文件的大小，然后进行合计，然后使用递归算法处理所有的子目录的文件，参考下面代码：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 计算一个目录的大小<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="di"&gt;</span><span style="COLOR: #008000">指定目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="includeSubDir"&gt;</span><span style="COLOR: #008000">是否</span><span style="COLOR: #008000">包含子目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> CalculateDirSize(DirectoryInfo di, </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> includeSubDir)<br />    {<br />        </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> totalSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 检查所有（直接）包含的文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        FileInfo[] files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> di.GetFiles();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (FileInfo file </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> files)<br />        {<br />            totalSize </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> file.Length;<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 检查所有子目录，如果includeSubDir参数为true</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (includeSubDir)<br />        {<br />            DirectoryInfo[] dirs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> di.GetDirectories();<br />            </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (DirectoryInfo dir </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> dirs)<br />            {<br />                totalSize </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> CalculateDirSize(dir, includeSubDir);<br />            }<br />        }<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> totalSize;<br />    }</span></div><p>    问题8：<span style="COLOR: #2000ff">如何使用通配符搜索指定目录内的所有文件；</span><br />    解决方案：<br />    使用DirectoryInfo.GetFiles方法的重载版本，它可以接受一个过滤表达式，返回FileInfo数组，另外它的参数还可以指定是否对子目录进行查找。如：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dir.GetFiles("</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">.txt"， SearchOption.AllDirectories);</span></div><p>    问题9：<span style="COLOR: #2000ff">如何复制、移动、重命名、删除文件和目录；</span><br />    解决方案：使用FileInfo和DirectoryInfo类。<br />    下面是FileInfo类的相关方法：<br />    FileInfo.CopyTo：将现有文件复制到新文件，其重载版本还允许覆盖已存在文件；<br />    FileInfo.MoveTo：将指定文件移到新位置，并提供指定新文件名的选项，所以可以用来重命名文件（而不改变位置）；    FileInfo.Delete：永久删除文件，如果文件不存在，则不执行任何操作；<br />    FileInfo.Replace：使用当前FileInfo对象对应文件的内容替换目标文件，而且指定另一个文件名作为被替换文件的备份，微软考虑实在周到。</p><p>    下面是DirectoryInfo类的相关方法：<br />    DirectoryInfo.Create：创建指定目录，如果指定路径中有多级目录不存在，该方法会一一创建；<br />    DirectoryInfo.CreateSubdirectory：创建当前对象对应的目录的子目录；<br />    DirectoryInfo.MoveTo：将目录（及其包含的内容）移动至一个新的目录，也可用来重命名目录；<br />    DirectoryInfo.Delete：删除目录（如果它存在的话）。如果要删除一个包含子目录的目录，要使用它的重载版本，以指定递归删除。<br /></p><p>    注意到了没有？DirectoryInfo类少了一个CopyTo方法，不过我们可以通过递归来实现这个功能：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> 复制目录到目标目录<br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="source"&gt;</span><span style="COLOR: #008000">源目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br />    </span><span style="COLOR: #808080">///</span><span style="COLOR: #008000"> </span><span style="COLOR: #808080">&lt;param name="destination"&gt;</span><span style="COLOR: #008000">目标目录</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #808080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CopyDirectory(DirectoryInfo source, DirectoryInfo destination)<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果两个目录相同，则无须复制</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (destination.FullName.Equals(source.FullName))<br />        {<br />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果目标目录不存在，创建它</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">destination.Exists)<br />        {<br />            destination.Create();<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 复制所有文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        FileInfo[] files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.GetFiles();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (FileInfo file </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> files)<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 将文件复制到目标目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            file.CopyTo(Path.Combine(destination.FullName, file.Name), </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 处理子目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        DirectoryInfo[] dirs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> source.GetDirectories();<br />        </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (DirectoryInfo dir </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> dirs)<br />        {<br />            </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> destinationDir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Path.Combine(destination.FullName, dir.Name);<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 递归处理子目录</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            CopyDirectory(dir, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DirectoryInfo(destinationDir));<br />        }<br />    }</span></div><p> </p><p>    问题10：<span style="COLOR: #2000ff">如何获得计算机的所有逻辑驱动器；</span><br />    解决方案：使用DriveInfo类（需要.NET 2.0）<br />    DriveInfo.GetDrives()：获得计算机的所有逻辑驱动器，返回类型为DriveInfo[]；  <br /></p><p>    问题11：<span style="COLOR: #2000ff">如何获取指定驱动器的信息；</span><br />    解决方案：<br />    DriveInfo.Name：获取驱动器的名称（如C:\）；<br />    DriveInfo.DriveType：获取驱动器的类型（如Fixed，CDRom，Removable，Network等）；<br />    DriveInfo.DriveFormat：获取驱动器的格式（如NTFS，FAT32，CDFS，UDF等）；<br />    DriveInfo.IsReady：获取驱动器是否已准备好，比如CD是否已放入CD驱动器，如果驱动器没有准备好，访问其信息会引发IOException类型异常；<br />    DriveInfo.AvailableFreeSpace：获取驱动器的可用空间；<br />    DriveInfo.TotalFreeSpace：获取驱动器总的可用空间，它与AvailableFreeSpace的不同在于AvailableFreeSpace会磁盘配额的设置；<br />    DriveInfo.TotalSize：获取驱动器总的空间；<br />    DriveInfo.RootDirectory：获得驱动器的根目录（DirectoryInfo类型）；</p><p>    至此，我们已经了解了文件和目录相关的一些基本操作。但还不清楚如何去读写文件的内容，下一篇中会详细了解这方面的操作。  <br /></p><img src ="http://www.blogjava.net/zgghc/aggbug/111840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-04-19 09:36 <a href="http://www.blogjava.net/zgghc/articles/111840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>路径，文件，目录，I/O常见操作汇总（三） </title><link>http://www.blogjava.net/zgghc/articles/111842.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 19 Apr 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/111842.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/111842.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/111842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/111842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/111842.html</trackback:ping><description><![CDATA[文件操作是程序中非常基础和重要的内容，而路径、文件、目录以及I/O都是在进行文件操作时的常见主题，这里想把这些常见的问题作个总结，对于每个问题，尽量提供一些解决方案，即使没有你想要的答案，也希望能提供给你一点有益的思路，如果你有好的建议，恳请能够留言，使这些内容更加完善。 <br />    <strong>主要内容：<br /></strong>    一、路径的相关操作，如判断路径是否合法，路径类型，路径的特定部分，合并路径，系统文件夹路径等内容；<br />    二、相关通用文件对话框，这些对话框可以帮助我们操作文件系统中的文件和目录；<br />    三、文件和目录操作，如复制、移动、删除、重命名，文件的版本信息，文件判等、搜索，读写文件等；<br />    四、读写文件，对文件系统的监视；<br />    五、其它，如临时文件，随机文件名等；
<p>    <a title="路径相关操作和通用文件对话框" style="COLOR: #e000ff" href="http://www.cnblogs.com/anderslly/archive/2006/12/24/602479.aspx" target="_blank">第一篇-路径的相关操作和通用文件对话框的使用<br /></a></p>    <a title="文件和目录的相关操作" style="COLOR: #ff00f0" href="http://www.cnblogs.com/anderslly/archive/2006/12/29/605344.html" target="_blank">第二篇-文件和目录的相关操作<br /></a><br />    这一篇将介绍第四、五部分。<br /><p>    <strong>文件读写相关类介绍:</strong><br />    文件读写操作涉及的类主要是：<br />    MarshalByRefObject 类：允许在支持远程处理的应用程序中跨应用程序域边界访问对象；<br />    BinaryReader 类：用特定的编码将基元数据类型读作二进制值。<br />    BinaryWriter 类： 以二进制形式将基元类型写入流，并支持用特定的编码写入字符串。<br />    Stream 类： 提供字节序列的一般视图。<br />    FileStream类：公开以文件为主的 Stream，既支持同步读写操作，也支持异步读写操作。<br />    MemoryStream 类：创建其支持存储区为内存的流。<br />    BufferedStream 类：给另一流上的读写操作添加一个缓冲层。<br />    TextReader 类：表示可读取连续字符系列的阅读器。<br />    TextWriter 类：表示可以编写一个有序字符系列的编写器。<br />    StreamReader 类：实现一个 TextReader，使其以一种特定的编码从字节流中读取字符。<br />    StreamWriter 类：实现一个 TextWriter，使其以一种特定的编码向流中写入字符。<br />    StringReader 类：实现从字符串进行读取的 TextReader。<br />    StringWriter 类：实现一个用于将信息写入字符串的 TextWriter。该信息存储在基础StringBuilder中。<br />    在使用它们之前最好能了解它们的继承关系，有助于作出最合适的选择：<br /></p><p>    另外还要注意一下FileInfo和File类的一些方法，如Create，CreateText，Open等，有时也会带来方便。<br />    这些类的内容比较繁多，更多内容还请参考MSDN。  </p><p>    下面是一些常见的问题及其解决方案：<br />    问题1：<span style="COLOR: #2000ff">如何读写文本文件（并考虑不同的编码类型）</span>；<br />    解决方案：<br />    创建一个FileStream对象用以引用该文件。要写入文件，将FileStream对象封装在StreamWriter对象中，使用其重载了的Write方法；要读取文件，将FileStream对象封装在StreamReader对象中，使用其Read或ReadLine方法；<br />    .NET Framework允许通过StreamWriter和StreamReader类操作任何流来读写文本文件。当使用StreamWriter类写入数据时，调用它的Write方法，该方法在重载后可以支持所有常见的C#数据类型，包括字符串、字符、整数、浮点数以及十进制数等。但Write方法总会将的得到的数据转换为文本，如果希望将这些文本转换回原来的数据类型，应使用WriteLine方法，以确保每个值都处于单独的一行上。<br />    字符串的表现形式取决于你使用的编码，最常见的编码类型包括下面几种：ASCII，UTF-16，UTF-7，UTF-8。<br />    .NET Framework在System.Text命名空间中为每种编码类型提供了一个类。在使用StreamWriter和StreamReader类时，可以指定需要的编码类型，或者使用默认的UTF-8。<br />    而在读取文本文件时，则要使用StreamReader类的Read或ReadLine方法。Read方法读取单个字符或者指定个数的字符，返回类型为字符或字符数组；ReadLine方法则返回包含整行内容的字符串；ReadToEnd方法从当前位置读取至流的结尾。<br />    （更多内容还请参考MSDN）<br />    写入文本文件的示例：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName, FileMode.Create))<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个StreamWriter对象，使用UTF-8编码格式</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (StreamWriter writer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StreamWriter(fs, Encoding.UTF8))<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 分别写入十进制数，字符串和字符类型的数据</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            writer.WriteLine(</span><span style="COLOR: #000000">123.45M</span><span style="COLOR: #000000">);<br />            writer.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">String Data</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            writer.WriteLine(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br />        }<br />    }</span></div>    <br />    读取文本文件的示例：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 以只读模式打开一个文本文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName, FileMode.Open))<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (StreamReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StreamReader(fs, Encoding.UTF8))<br />        {<br />            </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.Empty;<br /><br />            </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">reader.EndOfStream)<br />            {<br />                text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadLine();<br />                txtMessage.Text </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> text </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine;<br />            }<br />        }<br />    }</span></div><br />    问题2：<span style="COLOR: #2000ff">如何读写二进制文件（使用强数据类型）</span>；<br />    解决方案：<br />    创建一个FileStream对象用以引用该文件。要写入文件，将FileStream对象封装在BinaryWriter对象中，使用其重载了的Write方法；要读取文件，将FileStream对象封装在BinaryReader对象中，使用相应数据类型的Read方法。              <br />    .NET Framework允许通过BinaryWriter和BinaryReader类操作任何流来读写二进制数据。当使用BinaryWriter类写入数据时，调用它的Write方法，该方法在重载后可以支持所有常见的C#数据类型，包括字符串、字符、整数、浮点数以及十进制数等，然后数据会被编码为一系列字节写入文件，也可以配置该过程中的编码类型。<br />    在使用二进制文件时，一定要特别注意其中的数据类型。当你读取数据时，一定要使用BinaryReader类的某种强类型的Read方法。例如，要读取字符串，要使用ReadString方法。（BinaryWriter在写入二进制文件时总会记录字符串的长度以避免任何可能的错误）<br />    写入文件的示例：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName, FileMode.Create))<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (BinaryWriter writer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BinaryWriter(fs))<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 写入十进制数，字符串和字符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            writer.Write(</span><span style="COLOR: #000000">234.56M</span><span style="COLOR: #000000">);<br />            writer.Write(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            writer.Write(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br />        }<br />    }</span></div><br />    读取文件的示例：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 以只读模式打开一个二进制文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName, FileMode.Open))<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (StreamReader sr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StreamReader(fs))<br />        {<br />            MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">全部数据：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> sr.ReadToEnd());<br /><br />            fs.Position </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />            </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (BinaryReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BinaryReader(fs))<br />            {<br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 选用合适的数据类型读取数据</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> message </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.ReadDecimal().ToString() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine;<br />                message </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> reader.ReadString() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine;<br />                message </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> reader.ReadChar().ToString();<br />                MessageBox.Show(message);<br />            }<br />        }<br />    }</span></div><br />    问题3：<span style="COLOR: #2000ff">如何异步读取文件；</span><br />    解决方案：<br />    有时你需要读取一个文件但又不希望影响程序的执行。常见的情况是读取一个存储在网络驱动器上的文件。          <br />    FileStream提供了对异步操作的基本支持，即它的BeginRead和EndRead方法。使用这些方法，可以在.NET Framework线程池提供的线程中读取一个数据块，而无须直接与System.Threading命名空间中的线程类打交道。<br />    采用异步方式读取文件时，可以选择每次读取数据的大小。根据情况的不同，你可能会每次读取很小的数据（比如，你要将数据逐块拷贝至另一个文件），也可能是一个相对较大的数据（比如，在程序逻辑开始之前需要一定数量的数据）。在调用BeginRead时指定要读取数据块的大小，同时传入一个缓冲区（buffer）以存放数据。因为BeginRead和EndRead需要访问很多相同的信息，如FileStream，buffer，数据块大小等，因此将这些内容封装一个单独的类当中是一个好主意。<br />    下面这个类就是一个简单的示例。AsyncProcessor类提供了StartProcess方法，调用它开始读取，每次读取操作结束，OnCompletedRead回调函数会被触发，此时可以处理数据，如果还有剩余数据，则开始一个新的读取操作。默认情况下，AsyncProcessor类每次读取2KB数据。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> AsyncProcessor<br />    {<br />        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Stream inputStream;<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 每次读取块的大小</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> bufferSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2048</span><span style="COLOR: #000000">;<br /><br />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> BufferSize<br />        {<br />            </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000"> { </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> bufferSize; }<br />            </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000"> { bufferSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> value; }<br />        }<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 容纳接收数据的缓存</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] buffer;<br /><br />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> AsyncProcessor(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName)<br />        {<br />            buffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[bufferSize];<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 打开文件，指定参数为true以提供对异步操作的支持</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            inputStream </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />        }<br /><br />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> StartProcess()<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 开始异步读取文件，填充缓存区</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            inputStream.BeginRead(buffer, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, buffer.Length, OnCompletedRead, </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br />        }<br /><br />        </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnCompletedRead(IAsyncResult asyncResult)<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 已经异步读取一个 块 ，接收数据</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> bytesRead </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> inputStream.EndRead(asyncResult);<br /><br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 如果没有读取任何字节，则流已达文件结尾</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (bytesRead </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br />            {<br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 暂停以模拟对数据块的处理</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  异步线程：已读取一块</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                Thread.Sleep(TimeSpan.FromMilliseconds(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">));<br /><br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 开始读取下一块</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                inputStream.BeginRead(buffer, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, buffer.Length, OnCompletedRead, </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br />            }<br />            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />            {<br />                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 结束操作</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">                Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  异步线程：读取文件结束</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                inputStream.Close();<br />            }<br />        }<br />    }</span></div><br />    使用该类时可以这么写：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 开始在另一线程中异步读取文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    AsyncProcessor asyncIO </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AsyncProcessor(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />    asyncIO.StartProcess();<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 在主程序中，做其它事情，这里简单地循环10秒</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    DateTime startTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DateTime.Now;<br />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (DateTime.Now.Subtract(startTime).TotalSeconds </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">)<br />    {<br />        Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">主程序：正在进行</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 暂停线程以模拟耗时的操作</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        Thread.Sleep(TimeSpan.FromMilliseconds(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">));<br />    }<br /><br />    Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">主程序：已完成</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>     <br />    问题4：<span style="COLOR: #2000ff">如何创建临时文件</span>；<br />    解决方案：<br />    有时需要在特定用户的临时目录下创建一个临时文件，这要求该文件具有唯一的名称，避免与其它程序生成的临时文件相冲突。我们会有多种选择。最简单的是，在程序所在目录内使用GUID或时间戳加上随机值作为文件名称。但Path类提供的方法还是可以为你节省工作量，这就是它的静态GetTempFileName方法，它在当前用户的临时目录下创建一个临时文件（文件名称一定是唯一的），临时目录通常类似于这样：C:\Documents and Settings\[username]\Local Settings\Temp。 <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> tempFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Path.GetTempFileName();<br /><br />    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (FileStream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileStream(tempFile, FileMode.Open))<br />    {<br />        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (BinaryWriter writer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BinaryWriter(fs))<br />        {<br />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 写入数据</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            writer.Write(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">临时文件信息</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        }<br />    }<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Do something<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最后删除临时文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    File.Delete(tempFile);</span></div><br />    问题5：<span style="COLOR: #2000ff">如何获得随机文件名</span>；<br />    解决方案：<br />    使用Path.GetRandomFileName方法，它与GetTempFileName方法的不同之处在于它仅仅返回一个字符串但不会创建文件。<br /><p>    问题6：<span style="COLOR: #2000ff">监视文件系统的变化</span>；<br />    解决方案：<br />    如果指定路径内的文件发生改变（比如文件被修改或创建），你希望能对此作出反应。<br />    如果程序与其它多个程序或业务处理相关，常常需要创建一个程序，并且只有文件系统发生变化时它才处于活动状态。你可以创建一个这样的程序，让它定期区检测指定目录，此时会发现有件事情让你苦恼：检测得越频繁，就会浪费越多的系统资源；而检测得越少，那么检测到变化的时间就会越长。<br />    这时可以使用FileSystemWatcher组件，指定要进行监视的目录或文件，并处理其Created，Deleted，Renamed，Changed事件。<br />    要使用FileSystemWatcher组件，首先要创建它的一个实例，然后设置下列属性：<br />    Path：指定要监视的目录；<br />    Filter：指定要监视的文件类型，如”*.txt”；<br />    NotifyFilter：指定要监视的变化类型；<br />    FileSystemWatcher会引发四个关键的事件：Created，Deleted，Renamed，Changed。这些事件都在其FileSystemEventArgs参数中提供了相关文件的信息：如文件名，路径，改变类型，Renamed事件中还可以了解到改变前的文件名和路径。如果要禁用这些事件，则将它的EnableRaisingEvents属性设置为false。Created，Deleted，Renamed三个事件比较容易处理，但Changed事件就得当心了，你需要设置它的NotifyFilter属性以指示监视那些类型的变化。否则，程序会在文件被修改时淹没在不断发生的事件中（缓存区溢出）。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 设置相关属性</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    watcher.Path </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> appPath;<br />    watcher.Filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    watcher.IncludeSubdirectories </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><br />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 添加事件处理函数</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    watcher.Created </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileSystemEventHandler(OnChanged);<br />    watcher.Deleted </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileSystemEventHandler(OnChanged);<br />    watcher.Changed </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileSystemEventHandler(OnChanged);<br />    watcher.Renamed </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> RenamedEventHandler(OnRenamed);</span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnRenamed(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, RenamedEventArgs e)<br />    {<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> renamedFormat </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">File: {0} 被重命名为 :{1}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />        txtChangedInfo.Text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.Format(renamedFormat, e.OldFullPath, e.FullPath);<br />    }<br /><br />    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnChanged(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000"> sender, FileSystemEventArgs e)<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 显示通知信息</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        txtChangedInfo.Text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> e.FullPath </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">发生改变</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine;<br />        txtChangedInfo.Text </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">改变类型: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> e.ChangeType.ToString();<br />    }</span></div><br />    问题7：<span style="COLOR: #2000ff">如何使用独立存储文件</span>；<br />    解决方案：<br />    有时你需要将数据存储在文件中，但对本地硬盘驱动器却没有必要的权限（FileIOPermission）。这时要用到System.IO.IsolatedStorage命名空间中的类，这些类允许你的程序在特定用户的目录下将数据写入文件而不需要直接访问硬盘驱动器的权限：<br /><p></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建当前用户的独立存储</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (IsolatedStorageFile store </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IsolatedStorageFile.GetUserStoreForAssembly())<br />    {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个文件夹</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        store.CreateDirectory(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyFolder</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个独立存储文件</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> (Stream fs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> IsolatedStorageFileStream(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyFile.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, FileMode.Create, store))<br />        {<br />            StreamWriter writer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StreamWriter(fs);<br />            writer.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Test Line!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            writer.Flush();<br />        }<br /><br />        Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前大小：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> store.CurrentSize.ToString() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine);<br />        Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">范围：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> store.Scope.ToString() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine);<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[] files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> store.GetFileNames(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (files.Length </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br />        {<br />            Debug.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前文件：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine);<br />            </span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> file </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> files)<br />            {<br />                Debug.WriteLine(file </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Environment.NewLine);<br />            }<br />        }<br /></span><span style="COLOR: #000000">    }</span></div><br />    <span style="COLOR: #ff0000">注意</span>：本文部分内容为作示例都作了简化，所以肯定会有不合理之处，仅希望能为您提供一些线索和思路。在使用前还请多多参考相关资料。 <img src ="http://www.blogjava.net/zgghc/aggbug/111842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-04-19 09:36 <a href="http://www.blogjava.net/zgghc/articles/111842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>路径，文件，目录，I/O常见操作汇总（一） </title><link>http://www.blogjava.net/zgghc/articles/111839.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 19 Apr 2007 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/111839.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/111839.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/111839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/111839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/111839.html</trackback:ping><description><![CDATA[
		<strong>摘要:<br /></strong>    文件操作是程序中非常基础和重要的内容，而路径、文件、目录以及I/O都是在进行文件操作时的常见主题，这里想把这些常见的问题作个总结，对于每个问题，尽量提供一些解决方案，即使没有你想要的答案，也希望能提供给你一点有益的思路，如果你有好的建议，恳请能够留言，使这些内容更加完善。 <br />    <span style="FONT-WEIGHT: bold">主要内容：<br /></span>    一、路径的相关操作， 如判断路径是否合法，路径类型，路径的特定部分，合并路径，系统文件夹路径等内容；<br />    二、相关通用文件对话框，这些对话框可以帮助我们操作文件系统中的文件和目录；<br />    三、文件、目录、驱动器的操作，如获取它们的基本信息，获取和设置文件和目录的属性，文件的版本信息，<br />        搜索文件和目录，文件判等，复制、移动、删除、重命名文件和目录；<br />    四、读写文件，包括临时文件，随机文件名等；<br />    五、对文件系统的监视； <br />    这一篇就先写一下前两部分。<br /><br />    <strong>一、路径相关操作</strong><br />    问题1：<span style="COLOR: #1f00fc">如何判定一个给定的路径是否有效/合法；</span><br />    解决方案：通过Path.GetInvalidPathChars或Path.GetInvalidFileNameChars方法获得非法的路径/文件名字符，可以<br />    根据它来判断路径中是否包含非法字符；<br /><br />    问题2：<span style="COLOR: #1f00fc">如何确定一个路径字符串是表示目录还是文件；<br />    </span>解决方案：<br />    1、使用Directory.Exists或File.Exist方法，如果前者为真，则路径表示目录；如果后者为真，则路径表示文件；<br />    2、上面的方法有个缺点就是不能处理那些不存在的文件或目录。这时可以考虑使用Path.GetFileName方法获得<br />       其包含的文件名，如果一个路径不为空，而文件名为空那么它表示目录，否则表示文件；<br /><br />    问题3：<span style="COLOR: #2000ff">如何获得路径的某个特定部分（如文件名、扩展名等）；</span><br />    解决方案：<br />    下面是几个相关方法：<br />    Path.GetDirectoryName ：返回指定路径字符串的目录信息；<br />    Path.GetExtension ： 返回指定的路径字符串的扩展名；<br />    Path.GetFileName ： 返回指定路径字符串的文件名和扩展名；<br />    Path.GetFileNameWithoutExtension ：返回不具有扩展名的路径字符串的文件名；<br />    Path.GetPathRoot ：获取指定路径的根目录信息；<br />    （更多内容还请参考MSDN）<br /><br />    问题4：<span style="COLOR: #2000ff">如何准确地合并两个路径而不用去担心那个烦人的”\”字符；</span><br />    解决方案：<br />    使用Path.Combine方法，它会帮你处理烦人的”\”； 
<p>    问题5：<span style="COLOR: #2000ff">如何获得系统目录的的路径（如桌面，我的文档，临时文件夹等）；</span><br />    解决方案：<br />    主要是使用System. Environment类的相关属性和方法：<br />    Environment. SystemDirectory属性：获取系统目录的完全限定路径；<br />    Environment. GetFolderPath方法：该方法接受的参数类型为Environment.SpecialFolder枚举，<br />    通过这个方法可以获得大量系统文件夹的路径，如我的电脑，我的电脑，桌面，系统目录等；<br />    （更多内容还请参考MSDN）；<br />    Path.GetTempPath方法：返回当前系统的临时文件夹的路径；</p><p>    问题6：<span style="COLOR: #2000ff">如何判断一个路径是绝对路径还是相对路径；</span><br />    解决方案：<br />    使用Path.IsPathRooted方法；</p><p>    问题7：<span style="COLOR: #2000ff">如何读取或设置当前目录；</span><br />    解决方案：<br />    使用Directory类的GetCurrentDirectory和SetCurrentDirectory方法；</p><p>    问题8：<span style="COLOR: #2000ff">如何使用相对路径；</span><br />    解决方案：<br />    设置当前目录后（见问题7），就可以使用相对路径了。对于一个相对路径，我们可以<br />    使用Path.GetFullPath方法获得它的完全限定路径（绝对路径）。</p><p>    注意：如果打算使用相对路径，建议你将工作目录设置为各个交互文件的共同起点，否则可能会引入<br />    一些不易发现的安全隐患，被恶意用户利用来访问系统文件。<br /><br />    更多内容：<br />    通常我们可以使用System.IO.Path类来处理路径。该类提供了一套方法和属性用于对包含文件或目录路径信息的字符串执行操作，这些操作是以跨平台的方式执行的，而这些方法和属性都是静态的。</p><p>    注意路径仅仅是提供文件或目录位置的字符串。路径不必指向磁盘上的位置，例如，路径可以映射到内存中或设备上的位置。路径的准确格式是由当前平台确定的。例如，在某些系统上，路径可以驱动器号或卷号开始，而此元素在其他系统中是不存在的。在某些系统上，文件路径可以包含扩展名，扩展名指示在文件中存储的信息的类型。文件扩展名的格式是与平台相关的；例如，某些系统将扩展名的长度限制为 3 个字符，而其他系统则没有这样的限制。当前平台还确定用于分隔路径中各元素的字符集，以及确定在指定路径时不能使用的字符集。因为这些差异，所以 Path 类的字段以及 Path 类的某些成员的准确行为是与平台相关的。</p><p>    路径可以包含绝对或相对位置信息。绝对路径完整指定一个位置：文件或目录可被唯一标识，而与当前位置无关。相对路径指定部分位置：当定位用相对路径指定的文件时，当前位置用作起始点。</p><p>    Path类的大多数成员不与文件系统交互，并且不验证路径字符串指定的文件是否存在。修改路径字符串的Path 类成员（例如 ChangeExtension）对文件系统中文件的名称没有影响。但Path成员确实验证指定路径字符串的内容；并且如果字符串包含在路径字符串中无效的字符（如 InvalidPathChars 中的定义），则引发 ArgumentException异常。例如，在基于 Windows 的桌面平台上，无效路径字符可能包括引号 (")、小于号 (&lt;)、大于号 (&gt;)、管道符号 (|)、退格 (\b)、空 (\0) 以及从 16 到 18 和从 20 到 25的 Unicode 字符。</p><p>    Path 类的成员使您可以快速方便地执行常见操作，例如确定文件扩展名是否是路径的一部分，以及将两个字符串组合成一个路径名。</p>    多数情况下，如果这些方法接收了无效的路径会抛出异常，但如果路径名是因为包含了通配符（*或?）从而无效，则不会抛出异常（可以使用GetInvalidPathChars方法来非法的路径字符）。我们可以根据该原则判断一个路径是否合法。<br /><br />    <strong>二、相关的通用文件对话框</strong>    
<p>    1、<span style="COLOR: #2000ff">文件夹浏览对话框</span>（FolderBrowserDialog类）<br />    用户可以通过该对话框浏览、新建并选择文件夹，如下图：<br />    <img height="325" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/FolderBrowserDialog.JPG" width="338" /><br /></p><p>    主要属性：<br />    Description：树视图控件上显示的说明文本，如上图中的”选择要进行计算的目录”；<br />    RootFolder：获取或设置从其开始浏览的根文件夹，如上图中设置的我的电脑（默认为桌面）；<br />    SelectedPath：获取或设置用户选定的路径，如果设置了该属性，打开对话框时会定位到指定路径，默认为根文件夹，关闭对话框时根据该属性获取用户用户选定的路径；<br />    ShowNewFolderButton：获取或设置是否显示新建对话框按钮；</p><p>    主要方法：<br />    ShowDialog：打开该对话框，返回值为DialogResult类型值，如果为DialogResult.OK，则可以由SelectedPath属性获取用户选定的路径；<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgOpenFolder.Description </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">选择要进行计算的目录</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFolder.RootFolder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Environment.SpecialFolder.MyComputer;<br />    dlgOpenFolder.ShowNewFolderButton </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    DialogResult result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFolder.ShowDialog(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (result </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        txtDirPath.Text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFolder.SelectedPath;<br />    }</span></div><p> </p><p>    2、<span style="COLOR: #2000ff">打开文件对话框</span>（OpenFileDialog类）<br />    用户可以通过该对话框选择一个文件，见下图：<br />    <img height="419" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/OpenFileDialog.JPG" width="571" /><br /></p>    主要属性：<br />    CheckFileExists：该值指示如果用户指定不存在的文件名，对话框是否显示警告；<br />    FileName(s)：获取或设置一个包含在文件对话框中选定的文件名的字符串；<br />    Filter：获取或设置对话框的文件类型列表；<br />    FilterIndex：对话框的文件类型列表的索引（基于1的）；<br />    InitialDirectory：获取或设置文件对话框显示的初始目录；<br />    Multiselect：该值指示对话框是否允许选择多个文件；<br />    ShowReadOnly：该值指示对话框是否包含只读复选框；<br />    Title：获取或设置文件对话框标题；<br />    主要方法：<br />    OpenFile：打开用户选定的具有<span style="COLOR: #2000ff">只读</span>权限的文件；<br />    ShowDialog：打开该模式对话框； <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgOpenFile.Title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">打开源文件</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.InitialDirectory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">C:\Inetpub\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.Filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgOpenFile.FilterIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />    dlgOpenFile.ShowReadOnly </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />    DialogResult dr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgOpenFile.ShowDialog();<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName = dlgOpenFile.FileName;<br />    }</span></div><p>    3、<span style="COLOR: #2000ff">保存文件对话框</span>（SaveFileDialog类）<br />    用户可以通过该对话框保存一个文件，见下图：<br />    <img height="422" alt="" src="http://www.cnblogs.com/images/cnblogs_com/anderslly/SaveFileDialog.JPG" width="571" /><br /></p><p>    主要属性：<br />    大部分与打开文件对话框类似，此处略过，下面几个值得注意：<br />    CreatePrompt：该值指示如果用户指定不存在的文件，是否提示用户允许创建该文件；<br />    OverwritePrompt：该值指示如果用户指定的文件名已存在，对话框是否显示警告；<br />    主要方法：<br />    OpenFile：打开用户选定的具有读/写权限的文件；<br />    ShowDialog：打开该模式对话框；<br />    示例代码：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    dlgSaveFile.Title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">打开目标文件</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.InitialDirectory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">C:\Inetpub\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.Filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    dlgSaveFile.FilterIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br />    DialogResult dr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dlgSaveFile.ShowDialog();<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dr </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> DialogResult.OK)<br />    {<br />        </span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> fileName = dlgSaveFile.FileName;<br />    }</span></div><br />    至此，我们操作的都只是路径，要知道，这些路径仅仅是字符串，还没有涉及到文件系统中的真实文件。下一篇中会详细了解有关文件和目录的相关操作。<img src ="http://www.blogjava.net/zgghc/aggbug/111839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-04-19 09:35 <a href="http://www.blogjava.net/zgghc/articles/111839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用.NET 2.0中的秒表－Stopwatch类进行速度测试 </title><link>http://www.blogjava.net/zgghc/articles/111835.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 19 Apr 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/111835.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/111835.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/111835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/111835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/111835.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="http://www.cnblogs.com/anderslly/archive/2006/12/17/stopwatchspeedtesting.html">使用.NET 2.0中的秒表－Stopwatch类进行速度测试</a>
		</h2>
		<span style="FONT-WEIGHT: bold">
		</span>    软件的运行速度必须要在用户可以接受的范围内。通常，改善那些短暂的但频繁使用的例程的速度会大幅度地提高软件的整体速度。<br />    要改善速度，当然首先要能够量度时间。好，那我们考虑一下在跑道上的情况，枪声一响，马上按下秒表开始计时，在选手到达终点那一刻结束计时，这时就可以知道该选手所用的时间了。要开始对下一轮比赛计时前，要先将秒表归零。.NET2.0也提供了这样一个秒表：Stopwatch类，它可以比较精确地测量时间。 
<p>    <strong>速度测试：</strong><span style="FONT-WEIGHT: bold"><br /></span>    软件的性能和可测性是一个复杂的主题。要确保应用程序能够满足用户的期望，就需要在开发周期内考虑它的性能和可测性。这在设计阶段至关重要，一个糟糕的设计几乎肯定会导致糟糕的用户体验。然而，仅仅有好的设计也不能保证程序能够高效地运行，最终代码的质量同样重要。<br />    量度一个运行时间较长的例程相当简单。如果一个过程会持续几分钟，只要一块腕表就可以记录它的时间了。比如一个执行时间为两分钟的过程，10%的改善能够节省12秒，这是很容易去确定的。<br />    而如果要测量一个非常短暂的过程，就要考虑更好的精确性了。比如有一些很小的例程，它们的运行时间可能只有千分之一秒，但会被调用100万次，这样的累积效果就明显了。在.NET framework的先前版本中，需要使用Windows API函数，而在.NET framework 2.0中，微软引入了Stopwatch（它就是我们的秒表）类来简化时间的量度任务。<br /><strong>    Stopwatch</strong><strong>类:</strong><br />    使用Stopwatch类来量度时间非常简单。跟现实生活中的秒表一样，这个类的对象也能够对计数器进行开始、停止、归零（重置）操作，不过它可比一般的秒表精确多了，它能够精确到微秒（也就是百万分之一秒）。<br /><strong>    示例代码：</strong><br />    要演示Stopwatch的使用还是来段代码吧。下面是一个控制台应用程序，它将1到100万之间的所有整数累加：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br /><br />    </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> StopWatchClass<br />    {<br />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Program<br />        {<br />            </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[] args)<br />            {<br /></span><span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> total </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10000000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />                {<br />                    total </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br />                }<br />            }<br />        }<br />    }</span></div>    <br />    添加Stopwatch对象：<br />    Stopwatch类位于System.Diagnostics命名空间。下面是添加对象后的代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br />    </span><span style="FONT-WEIGHT: bold; COLOR: #0000ff">using</span><span style="COLOR: #000000"><span style="FONT-WEIGHT: bold"> System.Diagnostics;</span><br /><br />    </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> StopWatchClass<br />    {<br />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Program<br />        {<br />            </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[] args)<br />            {<br />                <span style="FONT-WEIGHT: bold">Stopwatch timer </span></span><span style="FONT-WEIGHT: bold; COLOR: #000000">= </span><span style="FONT-WEIGHT: bold; COLOR: #0000ff">new</span><span style="COLOR: #000000"><span style="FONT-WEIGHT: bold"> Stopwatch();</span><br />                </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> total </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10000000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />                {<br />                    total </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br />                }<br /></span><span style="COLOR: #000000">            }<br />        }<br />    }</span></div><br />    控制Stopwatch对象：<br />    Stopwatch提供了几个方法用以控制Stopwatch对象。Start方法开始一个计时操作，Stop方法停止计时。此时如果第二次使用Start方法，将继续计时，最终的计时结果为两次计时的累加。为避免这种情况，在第二次计时前用Reset方法将对象归零。这三个方法都不需要参数。代码是： <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br />    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Diagnostics;<br /><br />    </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> StopWatchClass<br />    {<br />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Program<br />        {<br />            </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[] args)<br />            {<br />                Stopwatch timer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Stopwatch();<br />                </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> total </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />                <span style="FONT-WEIGHT: bold">timer.Start();</span><br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10000000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />                {<br />                    total </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br />                }<br /><br />                <span style="FONT-WEIGHT: bold">timer.Stop();</span></span><span style="COLOR: #000000"><br />            }<br />        }<br />    }</span></div><br />    读取Stopwatch结果：<br />    在结束计时后下一步就是读取计时结果了。Stopwatch类提供了以下属性：<br /><ol><li>Elapsed：返回一个TimeSpan对象，表示计时时间间隔； 
</li><li>ElapsedMilliseconds：返回计时经过的微秒数，精确度稍差，适合于稍长一点的计时； 
</li><li>ElapsedTicks：返回计时经过的计时器刻度（timer tick）数。计时器刻度是Stopwatch对象可能的最小量度单位。计时器刻度时间的长度由特定的计算机和操作系统确定。Stopwatch对象的Frequency静态字段的值表示一秒所包含的计时器刻度数。注意它与TimeSpan的Ticks属性所用的时间单位的区别。 </li></ol><ul></ul><p>    应当根据计时任务的情况选择其中的一个属性。在我们的示例程序中，Elapsed属性提供了需要的精确度，用它来输出经过的微秒数。这也是TimeSpan的最高精确度了。<br />    下面是最终的程序代码：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br />    </span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System.Diagnostics;<br /><br />    </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> StopWatchClass<br />    {<br />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Program<br />        {<br />            </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[] args)<br />            {<br />                Stopwatch timer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Stopwatch();<br />                </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> total </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><br />                timer.Start();<br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10000000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br />                {<br />                    total </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> i;<br />                }<br /><br />                timer.Stop();<br /><br />                </span><span style="FONT-WEIGHT: bold; COLOR: #0000ff">decimal</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> micro = timer.Elapsed.Ticks /</span><span style="COLOR: #000000"><span style="FONT-WEIGHT: bold"> 10m;</span><br />                Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Execution time was {0:F1} microseconds.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, micro);<br />            }<br />        }<br />    }</span></div><p><br />    另外，使用IsRunning属性可以查看一个Stopwatch实例是否正在计时，使用StartNew方法可以开始一个新的计时器。<br /><br />Example:<br />using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Diagnostics;</p><p>namespace StopWatchClass<br />{<br />    class Program<br />    {<br />        static void Main(string[] args)<br />        {<br />            Stopwatch timer = new Stopwatch();<br />            <br />            long total = 0;<br />            timer.Start();<br />            //for (int i = 0; i &lt;= 1000000;i++){total = total + i;}<br />            StringBuilder ss = new StringBuilder("你好");<br />            for (int i = 0; i &lt; 100; i++)<br />                ss.Append("masjkfhkjsadhfkashdfjasdhfkjasdfuirusdg");<br />            timer.Stop();<br />            double micr = timer.Elapsed.TotalMilliseconds;<br />            timer.Reset();<br />            timer.Start();<br />            string s = "你好";<br />            for (int i = 0; i &lt; 100; i++)<br />            {<br />                s = s + "masjkfhkjsadhfkashdfjasdhfkjasdfuirusdg";<br />            }<br />            timer.Stop();<br />            //NET执行效率工具<br />            string micro =Convert.ToString( timer.Elapsed.TotalMilliseconds );<br />            Console.WriteLine(micr + "    " + micro);<br />            Console.Read();<br />        }<br />    }<br />}<br /></p><img src ="http://www.blogjava.net/zgghc/aggbug/111835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-04-19 09:21 <a href="http://www.blogjava.net/zgghc/articles/111835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#中DateTime的问题</title><link>http://www.blogjava.net/zgghc/articles/96756.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Tue, 30 Jan 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/96756.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/96756.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/96756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/96756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/96756.html</trackback:ping><description><![CDATA[
		<span class="t18"> 
<p>这几天因为C#的DateTime困惑了一下，也顺便研究了一下DateTime对象，原来表现这么丰富！<br />我在这里主要介绍datetime类型在tostring()format的格式设置，然后有兴趣的还可以看看datetim类型是如何对其本身做操作符重载的，Msdn上有介绍，我就不累赘了。友情提示：datetime.now.tostring()方法默认的你是无法得到全部的时间的格式的，只能得到日期，得不到具体时间，如果要具体时间，就应该使用datetime的tostring（）重载，datetime.now.tostring("F")这样就能拿到完整的时间格式了。。。我也就是为这郁闷了好久。。。</p><p>参数format格式详细用法 <br />　格式字符 关联属性/说明 <br />　d ShortDatePattern <br />　D LongDatePattern <br />　f 完整日期和时间（长日期和短时间） <br />　F FullDateTimePattern（长日期和长时间） <br />　g 常规（短日期和短时间） <br />　G 常规（短日期和长时间） <br />　m、M MonthDayPattern <br />　r、R RFC1123Pattern <br />　s 使用当地时间的 SortableDateTimePattern（基于 ISO 8601） <br />　t ShortTimePattern <br />　T LongTimePattern <br />　u UniversalSortableDateTimePattern 用于显示通用时间的格式 <br />　U 使用通用时间的完整日期和时间（长日期和长时间） <br />　y、Y YearMonthPattern <br />　 <br />　下表列出了可被合并以构造自定义模式的模式。这些模式是区分大小写的；例如，识别“MM”，但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符，则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。 <br />　 <br />　格式模式 说明 <br />　d 月中的某一天。一位数的日期没有前导零。 <br />　dd 月中的某一天。一位数的日期有一个前导零。 <br />　ddd 周中某天的缩写名称，在 AbbreviatedDayNames 中定义。 <br />　dddd 周中某天的完整名称，在 DayNames 中定义。 <br />　M 月份数字。一位数的月份没有前导零。 <br />　MM 月份数字。一位数的月份有一个前导零。 <br />　MMM 月份的缩写名称，在 AbbreviatedMonthNames 中定义。 <br />　MMMM 月份的完整名称，在 MonthNames 中定义。 <br />　y 不包含纪元的年份。如果不包含纪元的年份小于 10，则显示不具有前导零的年份。 <br />　yy 不包含纪元的年份。如果不包含纪元的年份小于 10，则显示具有前导零的年份。 <br />　yyyy 包括纪元的四位数的年份。 <br />　gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串，则忽略该模式。 <br />　h 12 小时制的小时。一位数的小时数没有前导零。 <br />　hh 12 小时制的小时。一位数的小时数有前导零。 <br />　H 24 小时制的小时。一位数的小时数没有前导零。 <br />　HH 24 小时制的小时。一位数的小时数有前导零。 <br />　m 分钟。一位数的分钟数没有前导零。 <br />　mm 分钟。一位数的分钟数有一个前导零。 <br />　s 秒。一位数的秒数没有前导零。 <br />　ss 秒。一位数的秒数有一个前导零。 <br />　f 秒的小数精度为一位。其余数字被截断。 <br />　ff 秒的小数精度为两位。其余数字被截断。 <br />　fff 秒的小数精度为三位。其余数字被截断。 <br />　ffff 秒的小数精度为四位。其余数字被截断。 <br />　fffff 秒的小数精度为五位。其余数字被截断。 <br />　ffffff 秒的小数精度为六位。其余数字被截断。 <br />　fffffff 秒的小数精度为七位。其余数字被截断。 <br />　t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符（如果存在）。 <br />　tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项（如果存在）。 <br />　z 时区偏移量（“+”或“-”后面仅跟小时）。一位数的小时数没有前导零。例如，太平洋标准时间是“-8”。 <br />　zz 时区偏移量（“+”或“-”后面仅跟小时）。一位数的小时数有前导零。例如，太平洋标准时间是“-08”。 <br />　zzz 完整时区偏移量（“+”或“-”后面跟有小时和分钟）。一位数的小时数和分钟数有前导零。例如，太平洋标准时间是“-08:00”。 <br />　: 在 TimeSeparator 中定义的默认时间分隔符。 <br />　/ 在 DateSeparator 中定义的默认日期分隔符。 <br />　% c 其中 c 是格式模式（如果单独使用）。如果格式模式与原义字符或其他格式模式合并，则可以省略“%”字符。 <br />　\ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符，请使用“\\”。 <br />　 <br />　只有上面第二个表中列出的格式模式才能用于创建自定义模式；在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符；例如， <br />　 <br />　DateTime.ToString( "d") 返回 DateTime 值；“d”是标准短日期模式。 <br />　DateTime.ToString( "%d") 返回月中的某天；“%d”是自定义模式。 <br />　DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天；“d”是自定义模式。 <br />　 <br />　比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式 <br />　如要得到2005年06月 这样格式的时间 <br />　可以这样写: <br />　date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo)</p></span>
<img src ="http://www.blogjava.net/zgghc/aggbug/96756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-01-30 16:29 <a href="http://www.blogjava.net/zgghc/articles/96756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>net数据库操作</title><link>http://www.blogjava.net/zgghc/articles/93845.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 15 Jan 2007 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/93845.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/93845.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/93845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/93845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/93845.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注意：本文暂时不讲解																																				数据库																														的数据调出和显示，因为他涉及的东西比较多，所以我们将另外详细讲解。本文主要要讲的是数据库的增加、删除、修改。																																							...&nbsp;&nbsp;<a href='http://www.blogjava.net/zgghc/articles/93845.html'>阅读全文</a><img src ="http://www.blogjava.net/zgghc/aggbug/93845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-01-15 09:25 <a href="http://www.blogjava.net/zgghc/articles/93845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET 函数</title><link>http://www.blogjava.net/zgghc/articles/93116.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 11 Jan 2007 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/93116.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/93116.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/93116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/93116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/93116.html</trackback:ping><description><![CDATA[
		<span class="t18">
				<font color="#0000ff"> </font>
				<p>
						<font color="#0000ff">1、DateTime 数字型 <br />System.DateTime currentTime=new System.DateTime(); <br />1.1 取当前年月日时分秒 <br />currentTime=System.DateTime.Now; <br />1.2 取当前年 <br />int 年=currentTime.Year; <br />1.3 取当前月 <br />int 月=currentTime.Month; <br />1.4 取当前日 <br />int 日=currentTime.Day; <br />1.5 取当前时 <br />int 时=currentTime.Hour; <br />1.6 取当前分 <br />int 分=currentTime.Minute; <br />1.7 取当前秒 <br />int 秒=currentTime.Second; <br />1.8 取当前毫秒 <br />int 毫秒=currentTime.Millisecond; <br />（变量可用中文） </font>
				</p>
				<p>
						<font color="#0000ff">2、Int32.Parse(变量) Int32.Parse("常量") <br />字符型转换 转为32位数字型 </font>
				</p>
				<p>
						<font color="#0000ff">3、 变量.ToString() <br />字符型转换 转为字符串 <br />12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% </font>
				</p>
				<p>
						<font color="#0000ff">4、变量.Length 数字型 <br />取字串长度： <br />如： string str="中国"; <br />int Len = str.Length ; //Len是自定义变量， str是求测的字串的变量名 </font>
				</p>
				<p>
						<font color="#0000ff">5、System.Text.Encoding.Default.GetBytes(变量) <br />字码转换 转为比特码 <br />如：byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); <br />然后可得到比特长度： <br />len = bytStr.Length; </font>
				</p>
				<p>
						<font color="#0000ff">6、System.Text.StringBuilder("") <br />字符串相加，（+号是不是也一样？） <br />如：System.Text.StringBuilder sb = new System.Text.StringBuilder(""); <br />sb.Append("中华"); <br />sb.Append("人民"); <br />sb.Append("共和国"); </font>
				</p>
				<p>
						<font color="#0000ff">7、变量.Substring(参数1,参数2); <br />截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br />如：string s1 = str.Substring(0,2); </font>
				</p>
				<p>
						<font color="#0000ff">8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />取远程用户IP地址 </font>
				</p>
				<p>
						<font color="#0000ff">9、穿过代理服务器取远程用户真实IP地址： <br />if(Request.ServerVariables["HTTP_VIA"]!=null){ <br />string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); <br />}else{ <br />string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />} </font>
				</p>
				<p>
						<font color="#0000ff">10、 Session["变量"]; <br />存取Session值； <br />如，赋值： Session["username"]="小布什"; </font>
				</p>
				<p>
						<font color="#0000ff">取值： Object objName=Session["username"]; <br />String strName=objName.ToString(); <br />清空： Session.RemoveAll(); </font>
				</p>
				<p>
						<font color="#0000ff">11、String str=Request.QueryString["变量"]; <br />用超链接传送变量。 <br />如在任一页中建超链接:&lt;a href=Edit.aspx?fbid=23&gt;点击&lt;/a&gt; <br />在Edit.aspx页中取值：String str=Request.QueryString["fdid"]; </font>
				</p>
				<p>
						<font color="#0000ff">12、DOC对象.CreateElement("新建节点名"); <br />创建XML文档新节点 </font>
				</p>
				<p>
						<font color="#0000ff">13、父节点.AppendChild(子节点)； <br />将新建的子节点加到XML文档父节点下 </font>
				</p>
				<p>
						<font color="#0000ff">14、 父节点.RemoveChild(节点); <br />删除节点 </font>
				</p>
				<p>
						<font color="#0000ff">15、Response <br />Response.Write("字串")； <br />Response.Write(变量)； <br />向页面输出。 </font>
				</p>
				<p>
						<font color="#0000ff">Response.Redirect("URL地址"）； <br />跳转到URL指定的页面 </font>
				</p>
				<p>
						<font color="#0000ff">16、char.IsWhiteSpce(字串变量，位数)——逻辑型 <br />查指定位置是否空字符； <br />如： <br />string str="中国 人民"; <br />Response.Write(char.IsWhiteSpace(str,2)); //结果为：True, 第一个字符是0位，2是第三个字符。 </font>
				</p>
				<p>
						<font color="#0000ff">17、char.IsPunctuation('字符') --逻辑型 <br />查字符是否是标点符号 <br />如：Response.Write(char.IsPunctuation('A')); //返回：False </font>
				</p>
				<p>
						<font color="#0000ff">18、(int)'字符' <br />把字符转为数字，查代码点，注意是单引号。 <br />如： <br />Response.Write((int)'中'); //结果为中字的代码：20013 </font>
				</p>
				<p>
						<font color="#0000ff">19、(char)代码 <br />把数字转为字符，查代码代表的字符。 <br />如： <br />Response.Write((char)22269); //返回“国”字。 </font>
				</p>
				<p>
						<font color="#0000ff">20、 Trim() <br />清除字串前后空格 </font>
				</p>
				<p>
						<font color="#0000ff">21 、字串变量.Replace("子字串","替换为") <br />字串替换 <br />如： <br />string str="中国"; <br />str=str.Replace("国","央"); //将国字换为央字 <br />Response.Write(str); //输出结果为“中央” </font>
				</p>
				<p>
						<font color="#0000ff">再如：（这个非常实用） </font>
				</p>
				<p>
						<font color="#0000ff">string str="这是&lt;script&gt;脚本"; <br />str=str.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); //将左尖括号替换为&lt;font&gt; 与 &lt; 与 &lt;/font&gt; （或换为&lt;，但估计经XML存诸后，再提出仍会还原） <br />Response.Write(str); //显示为：“这是&lt;script&gt;脚本” </font>
				</p>
				<p>
						<font color="#0000ff">如果不替换，&lt;script&gt;将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。 <br />这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。 <br />具体实现：将你的表单提交按钮脚本加上下面代码： <br />string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 <br />strSubmit=strSubmit.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); <br />然后保存或输出strSubmit。 <br />用此方法还可以简单实现UBB代码。 </font>
				</p>
				<p>
						<font color="#0000ff">22、Math.Max(i,j) <br />取i与j中的最大值 <br />如 int x=Math.Max(5,10); // x将取值 10 </font>
				</p>
				<p>
						<font color="#0000ff">加一点吧 23、字串对比...... <br />加一点吧 </font>
				</p>
				<p>
						<font color="#0000ff">23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </font>
				</p>
				<p>
						<font color="#0000ff">(1)、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </font>
				</p>
				<p>
						<font color="#0000ff">(2)、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">(3)、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">24、IndexOf() 、LastIndexOf() <br />查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </font>
				</p>
				<p>
						<font color="#0000ff">25、Insert() <br />在字串中指定索引位插入指定字符。如： <br />str1.Insert(1,"字");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”； </font>
				</p>
				<p>
						<font color="#0000ff">26、PadLeft()、PadRight() <br />在字串左（或右）加空格或指定char字符，使字串达到指定长度，如： <br />&lt;% <br />string str1="中国人"; <br />str1=str1.PadLeft(10,'1'); //无第二参数为加空格 <br />Response.Write(str1); //结果为“1111111中国人” ， 字串长为10 <br />%&gt; </font>
				</p>
				<p>
						<font color="#0000ff">27、Remove() <br />从指定位置开始删除指定数的字符 <br />字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </font>
				</p>
				<p>
						<font color="#0000ff">1、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </font>
				</p>
				<p>
						<font color="#0000ff">2、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">3、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">IndexOf() <br />查找字串中指定字符或字串首次出现的位置,返首索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </font>
				</p>
				<p>
						<font color="#0000ff">1.9 取中文日期显示——年月日时分 <br />string strY=currentTime.ToString("f"); //不显示秒 </font>
				</p>
				<p>
						<font color="#0000ff">1.10 取中文日期显示_年月 <br />string strYM=currentTime.ToString("y"); </font>
				</p>
				<p>
						<font color="#0000ff">1.11 取中文日期显示_月日 <br />string strMD=currentTime.ToString("m"); </font>
				</p>
				<p>
						<font color="#0000ff">1.12 取当前年月日，格式为：2003-9-23 <br />string strYMD=currentTime.ToString("d"); </font>
				</p>
				<p>
						<font color="#0000ff">1.13 取当前时分，格式为：14：24 <br />string strT=currentTime.ToString("t"); <br />更新一下， 上面不能编辑： </font>
				</p>
				<p>
						<font color="#0000ff">c#.net函数和方法集(大家一起来加啊) </font>
				</p>
				<p>
						<font color="#0000ff">1、DateTime 数字型 <br />System.DateTime currentTime=new System.DateTime(); <br />1.1 取当前年月日时分秒 <br />currentTime=System.DateTime.Now; <br />1.2 取当前年 <br />int 年=currentTime.Year; <br />1.3 取当前月 <br />int 月=currentTime.Month; <br />1.4 取当前日 <br />int 日=currentTime.Day; <br />1.5 取当前时 <br />int 时=currentTime.Hour; <br />1.6 取当前分 <br />int 分=currentTime.Minute; <br />1.7 取当前秒 <br />int 秒=currentTime.Second; <br />1.8 取当前毫秒 <br />int 毫秒=currentTime.Millisecond; <br />（变量可用中文） </font>
				</p>
				<p>
						<font color="#0000ff">1.9 取中文日期显示——年月日时分 <br />string strY=currentTime.ToString("f"); //不显示秒 </font>
				</p>
				<p>
						<font color="#0000ff">1.10 取中文日期显示_年月 <br />string strYM=currentTime.ToString("y"); </font>
				</p>
				<p>
						<font color="#0000ff">1.11 取中文日期显示_月日 <br />string strMD=currentTime.ToString("m"); </font>
				</p>
				<p>
						<font color="#0000ff">1.12 取中文年月日 <br />string strYMD=currentTime.ToString("D"); <br />'www.knowsky.com<br />1.13 取当前时分，格式为：14：24 <br />string strT=currentTime.ToString("t"); </font>
				</p>
				<p>
						<font color="#0000ff">1.14 取当前时间，格式为：2003-09-23T14:46:48 <br />string strT=currentTime.ToString("s"); </font>
				</p>
				<p>
						<font color="#0000ff">1.15 取当前时间，格式为：2003-09-23 14:48:30Z <br />string strT=currentTime.ToString("u"); </font>
				</p>
				<p>
						<font color="#0000ff">1.16 取当前时间，格式为：2003-09-23 14:48 <br />string strT=currentTime.ToString("g"); </font>
				</p>
				<p>
						<font color="#0000ff">1.17 取当前时间，格式为：Tue, 23 Sep 2003 14:52:40 GMT <br />string strT=currentTime.ToString("r"); </font>
				</p>
				<p>
						<font color="#0000ff">1.18获得当前时间 n 天后的日期时间 <br />DateTime newDay = DateTime.Now.AddDays(100); </font>
				</p>
				<p>
						<font color="#0000ff">2、Int32.Parse(变量) Int32.Parse("常量") <br />字符型转换 转为32位数字型 </font>
				</p>
				<p>
						<font color="#0000ff">3、 变量.ToString() <br />字符型转换 转为字符串 <br />12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% </font>
				</p>
				<p>
						<font color="#0000ff">4、变量.Length 数字型 <br />取字串长度： <br />如： string str="中国"; <br />int Len = str.Length ; //Len是自定义变量， str是求测的字串的变量名 </font>
				</p>
				<p>
						<font color="#0000ff">5、System.Text.Encoding.Default.GetBytes(变量) <br />字码转换 转为比特码 <br />如：byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); <br />然后可得到比特长度： <br />len = bytStr.Length; </font>
				</p>
				<p>
						<font color="#0000ff">6、System.Text.StringBuilder("") <br />字符串相加，（+号是不是也一样？） <br />如：System.Text.StringBuilder sb = new System.Text.StringBuilder(""); <br />sb.Append("中华"); <br />sb.Append("人民"); <br />sb.Append("共和国"); </font>
				</p>
				<p>
						<font color="#0000ff">7、变量.Substring(参数1,参数2); <br />截取字串的一部分，参数1为左起始位数，参数2为截取几位。 <br />如：string s1 = str.Substring(0,2); </font>
				</p>
				<p>
						<font color="#0000ff">8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />取远程用户IP地址 </font>
				</p>
				<p>
						<font color="#0000ff">9、穿过代理服务器取远程用户真实IP地址： <br />if(Request.ServerVariables["HTTP_VIA"]!=null){ <br />string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); <br />}else{ <br />string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); <br />} </font>
				</p>
				<p>
						<font color="#0000ff">10、 Session["变量"]; <br />存取Session值； <br />如，赋值： Session["username"]="小布什"; </font>
				</p>
				<p>
						<font color="#0000ff">取值： Object objName=Session["username"]; <br />String strName=objName.ToString(); <br />清空： Session.RemoveAll(); </font>
				</p>
				<p>
						<font color="#0000ff">11、String str=Request.QueryString["变量"]; <br />用超链接传送变量。 <br />如在任一页中建超链接:&lt;a href=Edit.aspx?fbid=23&gt;点击&lt;/a&gt; <br />在Edit.aspx页中取值：String str=Request.QueryString["fdid"]; </font>
				</p>
				<p>
						<font color="#0000ff">12、DOC对象.CreateElement("新建节点名"); <br />创建XML文档新节点 </font>
				</p>
				<p>
						<font color="#0000ff">13、父节点.AppendChild(子节点)； <br />将新建的子节点加到XML文档父节点下 </font>
				</p>
				<p>
						<font color="#0000ff">14、 父节点.RemoveChild(节点); <br />删除节点 </font>
				</p>
				<p>
						<font color="#0000ff">15、Response <br />Response.Write("字串")； <br />Response.Write(变量)； <br />向页面输出。 </font>
				</p>
				<p>
						<font color="#0000ff">Response.Redirect("URL地址"）； <br />跳转到URL指定的页面 </font>
				</p>
				<p>
						<font color="#0000ff">16、char.IsWhiteSpce(字串变量，位数)——逻辑型 <br />查指定位置是否空字符； <br />如： <br />string str="中国 人民"; <br />Response.Write(char.IsWhiteSpace(str,2)); //结果为：True, 第一个字符是0位，2是第三个字符。 </font>
				</p>
				<p>
						<font color="#0000ff">17、char.IsPunctuation('字符') --逻辑型 <br />查字符是否是标点符号 <br />如：Response.Write(char.IsPunctuation('A')); //返回：False </font>
				</p>
				<p>
						<font color="#0000ff">18、(int)'字符' <br />把字符转为数字，查代码点，注意是单引号。 <br />如： <br />Response.Write((int)'中'); //结果为中字的代码：20013 </font>
				</p>
				<p>
						<font color="#0000ff">19、(char)代码 <br />把数字转为字符，查代码代表的字符。 <br />如： <br />Response.Write((char)22269); //返回“国”字。 </font>
				</p>
				<p>
						<font color="#0000ff">20、 Trim() <br />清除字串前后空格 </font>
				</p>
				<p>
						<font color="#0000ff">21 、字串变量.Replace("子字串","替换为") <br />字串替换 <br />如： <br />string str="中国"; <br />str=str.Replace("国","央"); //将国字换为央字 <br />Response.Write(str); //输出结果为“中央” </font>
				</p>
				<p>
						<font color="#0000ff">再如：（这个非常实用） </font>
				</p>
				<p>
						<font color="#0000ff">string str="这是&lt;script&gt;脚本"; <br />str=str.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); //将左尖括号替换为&lt;font&gt; 与 &lt; 与 &lt;/font&gt; （或换为&lt;，但估计经XML存诸后，再提出仍会还原） <br />Response.Write(str); //显示为：“这是&lt;script&gt;脚本” </font>
				</p>
				<p>
						<font color="#0000ff">如果不替换，&lt;script&gt;将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。 <br />这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。 <br />具体实现：将你的表单提交按钮脚本加上下面代码： <br />string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。 <br />strSubmit=strSubmit.Replace("&lt;","&lt;font&gt;&lt;&lt;/font&gt;"); <br />然后保存或输出strSubmit。 <br />用此方法还可以简单实现UBB代码。 </font>
				</p>
				<p>
						<font color="#0000ff">22、Math.Max(i,j) <br />取i与j中的最大值 <br />如 int x=Math.Max(5,10); // x将取值 10 </font>
				</p>
				<p>
						<font color="#0000ff">23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: </font>
				</p>
				<p>
						<font color="#0000ff">(1)、 <br />string str1; str2 <br />//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: <br />if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); } </font>
				</p>
				<p>
						<font color="#0000ff">(2)、 <br />//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">(3)、 <br />//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上. </font>
				</p>
				<p>
						<font color="#0000ff">24、IndexOf() 、LastIndexOf() <br />查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值，如： <br />str1.IndexOf("字")； //查找“字”在str1中的索引值（位置） <br />str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置） <br />str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置） </font>
				</p>
				<p>
						<font color="#0000ff">25、Insert() <br />在字串中指定索引位插入指定字符。如： <br />str1.Insert(1,"字");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”； </font>
				</p>
				<p>
						<font color="#0000ff">26、PadLeft()、PadRight() <br />在字串左（或右）加空格或指定char字符，使字串达到指定长度，如： <br />&lt;% <br />string str1="中国人"; <br />str1=str1.PadLeft(10,'1'); //无第二参数为加空格 <br />Response.Write(str1); //结果为“1111111中国人” ， 字串长为10 <br />%&gt; </font>
				</p>
				<p>
						<font color="#0000ff">27、Remove() <br />从指定位置开始删除指定数的字符 <br />&lt;% <br />string str1="我是萨达姆的崇拜者之一"; <br />Response.Write(str1.Remove(5,4)); //结果为“我是萨达姆之一” <br />%&gt;<br /></font>
				</p>
		</span>
<img src ="http://www.blogjava.net/zgghc/aggbug/93116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-01-11 11:44 <a href="http://www.blogjava.net/zgghc/articles/93116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新官方ASP.net教程</title><link>http://www.blogjava.net/zgghc/articles/93113.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 11 Jan 2007 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/93113.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/93113.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/93113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/93113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/93113.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Autodesk														官方最新的														.NET														教程（一）														(C#														版														)												第				 1				章				  Hello Wor...&nbsp;&nbsp;<a href='http://www.blogjava.net/zgghc/articles/93113.html'>阅读全文</a><img src ="http://www.blogjava.net/zgghc/aggbug/93113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-01-11 11:39 <a href="http://www.blogjava.net/zgghc/articles/93113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十天学会ASP.net</title><link>http://www.blogjava.net/zgghc/articles/93104.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Thu, 11 Jan 2007 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/93104.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/93104.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/93104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/93104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/93104.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#008000">十天学会ASP.net之第一天<br />我认为ASP.NET比ASP难很多，希望大家做好准备。难难在实现同一个效果有很多方法，大家或许会疑惑。十天学会系列教程会清晰的写出各种方法，让大家能少一点坎坷。在ASP里面，大家几乎都是使用VB，数据库嘛，也无非是SQL和ACCESS。在ASP.NET里面，数据库还是这两个但是常用的语言多了一个C#，也是微软推荐的语言，为.NET平台定制的语言。这样ASP.NET就有四种组合：VB+ACCESS，VB+SQL，C#+ACCESS，C#+SQL，本教程会使用C#+ACCESS，兼顾四种来写，让大家对ASP.NET有一个全面的认识。虽然说学习ASP.NET不需要任何ASP基础，但是我觉得如果大家ASP不会，还是先看一下【十天学会ASP教程】，大家所需要了解的不是ASP的程序怎么写，而是怎么构建服务器，怎么使用HTML表单，同时对SQL语句有一个基础和理解，因为在本文里我不会将将一些基础的东西。 <br />废话不多说，开始我们第一天的学习：<br />学习目的：调试出安装环境<br />    我要申明一点，操作系统就用2000，如果说要学习一个网络语言还不肯多装一个操作系统的话，那我看也不要学习了。<br />    先到网上下载一个MDAC(要是2.7以上的版本才行)，然后安装，安装以后或许会重新启动一次。<br />    然后再下载一个.NET FRAMEWORK SDK，安装以后会在控制面板里面的管理工具里面多两个东西，这个不用理睬他，我们要使用的还是原来的INTERNET服务管理器。打开它按照ASP教程里面的调试方法建立一个目录，建立一个EXAMPLE1.ASPX，然后用记事本打开这个文件在里面输入</font>
		</p>
		<p>
				<font color="#008000">&lt;script language="c#" runat="server"&gt;<br />void Page_Load()<br />{<br />Response.Write("Hello World!");<br />}<br />&lt;/script&gt;<br /> </font>
		</p>
		<p>
				<font color="#008000">&lt;script language="vb" runat="server"&gt;<br />sub page_load()<br />response.write("Hello World!")<br />end sub<br />&lt;/script&gt; </font>
		</p>
		<p>
				<font color="#008000">    然后用本地访问，查看结果：</font>
		</p>
		<p>
				<font color="#008000">
				</font>
		</p>
		<p>
				<font color="#008000">在这里我要说明两点：1、我的示例文件总是有A和B分别是用C#和VB写的，演示的图片就用C#那一种的，都一样嘛，教程里面代码也是写两种用&lt;hr&gt;分割开，大家可以比较一下。2、我写教程的时候用的都是记事本来编写APS.NET大家也可以安装VS.NET来编写不过起步还是用记事本比较好，因为可以看的更加透彻一点。<br />今天就说到这里，明天说一下C#的基本语法。<br />十天学会ASP.net之第二天<br />学习目的：掌握C#的基本知识<br />一、定义变量：<br />string strExample; 字符串("aaa")<br />char chrExample; 字符('a')<br />bool blnExample; Bool型(true/false)<br />DataTime datExample; 日期型("09/19/2002")<br />int intExample; 整数(32位有符号整数)<br />double dblExample; 浮点数(64位双精度浮点数)<br />二、各种运算：<br />= 赋值运算 <br />+ 加法运算<br />- 减法运算<br />* 乘法运算<br />/ 除法运算<br />% 取模运算<br />&amp;&amp; 逻辑And<br />|| 逻辑Or<br />! 逻辑Not<br />三、各种结构：<br />if(条件)<br />{<br />}<br />else<br />{<br />}<br />switch(条件)<br />{<br />case option1:<br />    break;<br />case option2:<br />    break;<br />}<br />for(int i=1;i&lt;=10;i++)//特别注意这里面是分号<br />{<br />}<br />while(条件)<br />{<br />}<br />do<br />{<br />}while(条件);<br />四、注意事项：<br />1、用习惯VB的人很容易漏了语句末尾的分号；<br />2、用习惯VB的人很随便使用变量但是不申明，这在C#默认情况下是不允许的；<br />3、在向函数传递参数的时候要用圆括号：Response.Write "aa";是不允许的。<br />我说的这点几乎称不上是在说一种语言，一种语言的学习不仅仅需要学习语法，还需要学习语言特色，希望大家有空还是买一本C#的书来好好研究一下C#作为一种新的语言的特性吧。今天就说到这里，明天说一下WEB控件。<br />十天学会ASP.net之第三天<br />学习目的：掌握WEB控件的使用(一)<br />    或许你会问，为什么需要WEB控件？WEB控间就好像VB里面的控间，可以在程序的任何地方引用，修改所有属性，有了它的配合才能完成代码分离。想一下，如果还是以前的HTML控间，我们当我们需要在某一个地方显示一段数据库的内容是不是只有用&lt;%= %&gt;这样势必在HTML包含了程序的代码块，就达不到分离代码和界面的目的了。<br />    或许你还会问，为什么要代码分离那？原因很简单，不是每一个程序员都是合格的网页设计师，如果我们需要修改代码的时候会破坏网页设计师原来的设定，是不是不方便那，程序代码和HTML代码混合在一起对于程序员来说也不方便修改代码。当然，我们的网页设计师也需要学习一点WEB控间的知识。 <br />    下面来一个一个介绍：<br />一、Label控件：<br />主要属性：<br />Text 标签所显示的文本<br />范例：&lt;asp:Label id="lblMessage" Text="aaa" runat="server"/&gt;<br />需要注意的是我们不能遗漏runat="server"字样，还有所有的WEB控件都要包含在&lt;form runat="server"&gt;&lt;/form&gt;中间<br />下面看一个完整的例子，在程序里面修改Label的Text属性，以此改变网页的显示。<br />&lt;script runat="server" language="c#"&gt;<br />void Page_Load()<br />{<br />lblMessage.Text="Hello World!";<br />}<br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt;<br />&lt;form runat="server"&gt;<br />&lt;asp:Label id="lblMessage" runat="server"/&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; <br /> <br />--------------------------------------------------------------------------------</font>
		</p>
		<p>
				<font color="#008000">&lt;script runat="server" language="vb"&gt;<br />sub Page_Load<br />lblMessage.Text="Hello World!"<br />end sub<br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt;<br />&lt;form runat="server"&gt;<br />&lt;asp:Label id="lblMessage" runat="server"/&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; <br />二、TextBox控件：<br />主要属性： <br />Text 控件显示的文本；<br />MaxLength 文本框可以添加的最多的字符数（多行文本框无效）；<br />ReadOnly 只读；<br />TextMode 有下面几个有效值 MultiLine,Password,SingleLine；<br />Rows 指定文本框的垂直尺寸<br />三、Button控件：<br />有三种：Button 标准的表单按钮；ImageButton 显示图像的表单按钮；LinkButton 显示作为超链接样子Button<br />Button基本上就是Text属性来设置按钮上面的文字；<br />ImageButton基本上就是ImageUrl来设置按钮上图象的地址；AlternativeText 在浏览器不支持图片的时候显示的文字；<br />LinkButton基本上就是Text属性来设置按钮上的文字；<br />他们三者共同的属性就是CausesValidation=true/false来设置按钮提交的表单是不是被检验（后面将说到检验控件）<br />他们三者共同的方法就是OnClick就是点击按钮的时候触发的函数，下面举一个例子：<br />&lt;script runat="server" language="c#"&gt;<br />void btnCounter_OnClick(object sender,EventArgs e)<br />{<br />btnCounter.Text="Clicked";<br />} <br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt;<br />&lt;form runat="server"&gt;<br />&lt;asp:Button Text="UnClicked" OnClick="btnCounter_OnClick" id="btnCounter" runat="server"/&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; <br /> <br />--------------------------------------------------------------------------------</font>
		</p>
		<p>
				<font color="#008000">&lt;script runat="server" language="vb"&gt;<br />sub btn_COunter_OnClick(s as object,e as eventargs)<br />btnCounter.Text="Clicked" <br />end sub<br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;head&gt;&lt;title&gt;Label.aspx&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt;<br />&lt;form runat="server"&gt;<br />&lt;asp:Button Text="UnClicked" OnClick="btnCounter_OnClick" id="btnCounter" runat="server"/&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt; <br />今天就说这三个控件，明天继续。<br />十天学会ASP.net之第四天<br />学习目的：掌握WEB控件的使用(二)<br />    首先我要说明，我这十天教程也只是一个让大家对ASP.NET有一个认识而已，我也跳过了很多东西。网上有很多人在责骂我写的教程，认为十天什么都学不会，看了我的教程还是什么都不会，我想他们或许是过高估计了我的教程。外面有很多书，关于ASP和ASP.NET的，我就是看外面的书学会的。我所要做的就是希望大家能看了我的教程以后觉得ASP和ASP.NET不是学不会的东西然后有信心去学会它。我想学习还是靠自己的，外面每一本书也有自己写的不周到的地方，关键还需要自己的实践加上探索。<br />首先来说一下表单的验证控件，以前我们做表单验证，如果是客户端的javascript，不能做到美观统一，而且还可以通过直接在浏览器起教表单来屏蔽；如果我们做服务器端验证，又会发现让检验结果在前台反映也是很麻烦的事情。现在好了，ASP.NET提供的很多检验控件让我们不需要考虑是客户端检验还是服务器端检验，让我们不需要考虑是怎么输出检验结果。<br />看一下检验表单控件是不是填写了的检验控件先：<br />&lt;asp:textbox id="username" runat="server" CSSclass="textbox"/&gt; <br />&lt;asp:requiredfieldvalidator controltovalidate="username" display="dynamic" forecolor="#ff0000" font-name="宋体" font-size="9pt" text="请填写" runat="server"/&gt; <br />controltovalidate就是你想检验的控件的ID；默认情况下不显示错误消息，地方也会被保留，如果使用了display="dynamic" 那么不显示错误消息的地方不会被空出； forecolor="#ff0000" font-name="宋体" font-size="9pt" 就是设定错误消息字体的颜色，字体，大小的；text="请填写" 就是当没有填写内容时候显示的错误消息；别忘记最后的runat="server"。现在这个检验控件是放在了textbox的后面，那么错误消息也在textbox后面显示，也可以放在其他地方。<br />再看一下比较表单控件的数据与另外一个数据的检验控件：<br />&lt;asp:textbox id="password1" runat="server" textmode="password" cssclass="textbox"/&gt; <br />&lt;asp:requiredfieldvalidator controltovalidate="password1" display="dynamic" forecolor="#ff0000" font-name="宋体" font-size="9pt" text="请填写" runat="server"/&gt; <br />这里是第一个需要用户填写的密码框<br />我们经常会再设立一个密码框让用户再填写一次：<br />&lt;asp:textbox id="password2" runat="server" textmode="password" cssclass="textbox"/&gt; <br />&lt;asp:requiredfieldvalidator controltovalidate="password2" display="dynamic" forecolor="#ff0000" font-name="宋体" font-size="9pt" text="请填写" runat="server"/&gt; <br />&lt;asp:comparevalidator controltovalidate="password2" controltocompare="password1" display="dynamic" operator="equal" forecolor="#ff0000" font-name="宋体" font-size="9pt" text="确认失败" runat="server"/&gt; <br />controltocompare="password1" 就是需要比较的控件；operator="equal" 就是设定比较操作是：是否相等（还有NotEqual：不相等,LessThan：少于,GreaterThan：大于，当不符合这个比较操作的时候显示错误消息）。<br />以前说到BUTTON控件CausesValidation=true/false来设置按钮提交的表单是不是被检验也就是这里的几个检验控件，如果CausesValidation=true的话按下按钮就会首先检测是不是都通过了检验控件的检验。<br />下面再说两点：<br />一、每一个可以显示的控件都有是不是显示的属性，比如username.Visible=false;就是隐藏了前面的username控件；还有就是如果要对控件应用CSS的话就这么写：cssclass=""，而不是以前HTML中的class=""。<br />二、所有WEB控件都要包含在&lt;form runat="server"&gt;&lt;/form&gt;中，否则就会出错。<br />今天就到此结束，请继续往后面看，下次开始就要说ADO.NET了。<br />十天学会ASP.net之第五天<br />学习目的：学会连接两种数据库<br />对于ASP来说，我们常用的数据库无非是ACCESS和SQL SERVER，对于ASP.NET也是，不过ASP.NET对于SQL SERVER有专门的连接组件而不推荐用OLE DB。<br />首先看一下ACCESS的连接数据库并打开；<br />string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";<br />strConnection+=Server.MapPath("*.mdb"); //*就是数据库的名字<br />OleDbConnection objConnection=new OleDbConnection(strConnection);<br />objConnection.Open(); <br /> <br />--------------------------------------------------------------------------------<br />dim objConnection as OleDbConnection<br />objConnection=new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source="+Server.MapPath("*.mdb")) <br />objConnection.Open() <br />下面再看一下SQL SERVER的连接数据库并打开；<br />string strConnection="server=数据库连接;uid=用户名;pwd=密码;database=数据库名字";<br />SqlConnediob objConnection=new SqlCOnnection(strConnection);<br />objConnection.Open();<br /> <br />--------------------------------------------------------------------------------<br />dim objConnection as SqlConnectiom<br />objConnection=new SqlConnection("server=数据库连接;uid=用户名;pwd=密码;database=数据库名字") <br />objConnection.Open() <br />实际上，在大多数地方SQL SERVER和ACCESS的区别除了连接语句，其他定义语句也就是SQL××和OLEDB××的区别<br />另外，如果是ACCESS数据库的话在ASPX文件的开头需要包括下列语句：<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data"%&gt;<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data.OleDb"%&gt;<br />如果是SQL SERVER则需要包括以下语句：<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data"%&gt;<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data.SqlClient"%&gt; <br />今天就说到这里，明天开始讲数据库的读取。<br />十天学会ASP.net之第六天<br />学习目的：学会读取数据库<br />有的网友说，不会C#，在ASP.NET里面还是选择VB.NET，这个我不反对，但是我觉得既然是学习新的东西，就不要在意有多少是新的。实际上C#就一般的操作来说，只是区分大小写和多了一个分号这两点与VB.NET不同其他都差不多啊。在ASP里面我们读取数据就直接用RECORDSET，然后在HTML代码里面穿插&lt;%= %&gt;就可以显示了，但是ASP.NET讲究的是代码分离，如果还是这样显示数据就不能代码分离了。所以我们有两种方法：如果是读取一条记录的数据或者不多的数据，我们用DATAREADER采集数据，然后赋值给LABEL控件的Text属性即可；如果是读取大量数据我们就采用DATAGRID。<br />今天我们就来说一下DATAREADER：<br />string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";<br />strConnection+=Server.MapPath(strDb);<br />OleDbConnection objConnection=new OleDbConnection(strConnection);<br />OleDbCommand objCommand = new OleDbCommand("这里是SQL语句" , objConnection); <br />objConnection.Open();<br />OleDbDataReader objDataReader=objCommand.ExecuteReader();<br />if(objDataReader.Read())<br />{<br />oicq.Text=Convert.ToString(objDataReader["useroicq"]);<br />homesite.Text=Convert.ToString(objDataReader["usersite"]);<br />face.SelectedItem.Text=Convert.ToString(objDataReader["userface"]);<br />} <br />大家可以看到我们首先是连接数据库然后打开，对于select的命令，我们申明一个OleDbCommand来执行之，然后再申明一个OleDbDataReader，来读取数据，用的是ExecuteReader()，objDataReader.Read()就开始读取了，在输出的时候我们要注意Text属性接受的只能是字符串，所以我们要把读出的数据都转化为字符串才行。<br />转换变量类型函数：<br />转换为字符串：Convert.ToString()<br />转换为数字：Convert.ToInt64()，Convert.ToInt32()，Convert.ToInt16() 是按照数字位数由长到短<br />转换为日期：Convert.ToDateTime()<br /> <br />--------------------------------------------------------------------------------<br />dim objConnection as OleDbConnection<br />dim objCommand as OleDbCommand<br />dim objDataReader as OleDbDataReader<br />objConnection=new OleDbConnection(Provider=Microsoft.Jet.OleDb.4.0;Data Source="+Server.MapPath(strDb))<br />objCommand=new OleDbCommand("这里是SQL语句" , objConnection) <br />objConnection.Open()<br />objDataReader=objCommand.ExecuteReader()<br />if objDataReader.Read()<br />oicq.Text=Convert.ToString(objDataReader["useroicq"])<br />homesite.Text=Convert.ToString(objDataReader["usersite"])<br />face.SelectedItem.Text=Convert.ToString(objDataReader["userface"])<br />end if<br />其实大家比较一下C#和VB的语法，会发觉用C#似乎更加简单，教程里面我侧重C#，对于VB的代码我就不解释了。<br />下面说一下如果代码是读取SQL数据库，我们这样来转变<br />1、把代码开始的<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data"%&gt;<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data.OleDb"%&gt;<br />修改为<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data"%&gt;<br />&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System.Data.SqlClient"%&gt; <br />2、把代码里面所有申明的对象OleDb××变为Sql××就这么简单<br />你甚至可以用替换所有来解决，所以今后我讲不再列出Sql Server的代码了。<br />今天就说到这里，明天开始说数据的添加、删除、修改。<br />十天学会ASP.net之第七天<br />学习目的：学会添加删除修改记录<br />以前我们在ASP中不管是添加还是删除记录或者用SQL语句加上EXECUTE()或者就是直接用RECORDSET的NEW、DELETE、UPDATE等方法来添加删除修改记录。在ASP.NET里面我们采用SQL语句加上COMMAND对象来执行SQL语句的方法来添加删除修改记录。这比上次说的读取记录还简单。实际上只有一点区别，把ExecuteReader()修改为ExecuteNonQuery()即可，因为我们不需要返回值啊。<br />string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";<br />strConnection+=Server.MapPath(strDb);<br />OleDbConnection objConnection=new OleDbConnection(strConnection);<br />OleDbCommand objCommand = new OleDbCommand("这里是SQL语句" , objConnection); <br />objConnection.Open();<br />OleDbDataReader objDataReader=objCommand.ExecuteNonQuery();<br /> <br />--------------------------------------------------------------------------------<br />dim objConnection as OleDbConnection<br />dim objCommand as OleDbCommand<br />objConnection=new OleDbConnection(Provider=Microsoft.Jet.OleDb.4.0;Data Source="+Server.MapPath(strDb))<br />objCommand=new OleDbCommand("这里是SQL语句" , objConnection) <br />objConnection.Open()<br />objDataReader=objCommand.ExecuteNoQuery() <br />下面再举例子说明一下SQL语句（ACCESS）：<br />添加记录： insert int <br />o 表名 (字段1，字段2) values (字符串1，字符串2) where 条件<br />删除记录： delete from 表名 where 条件<br />修改记录： update 表名 set 字段1=××，字段2=×× where 条件<br />需要特别注意，如果是Sql Server删除记录是delete 表名，不需要再加from了。 <br />今天就说到这里了，明天说ASP.NET里面最著名的DATAGRID。<br />十天学会ASP.net之第八天<br />学习目的：初步掌握DATAGRID的使用<br />以前在ASP中，我们显示大批量数据经常使用循环读取记录集的方式，在表格中插入代码来显示，循环的是&lt;tr&gt;，如果是分页还需要自己制作，如果排序更加复杂，在ASP.NET中就好了，一切工作都可以让DATAGRID来做。<br />首先看一下DATAGRID的样式方面的属性<br />BackImageUrl="" 背景图片<br />CellSpacing="" 单元格间距<br />CellPadding="" 单元格填充<br />CSSClass="" 使用的CSS样式<br />DATAGRID可以自动用表中的字段名放在显示的记录的头部来表示各个单元格所代表的意义，用ShowHeader="true/false"来控制是不是显示，在大多数情况下我们是不需要这个功能的，因为我们数据库中的字段名大多是英文的，而我们想在页面输出的大多是中文名字。<br />下面看一下显示数据库内所有记录，就几行代码：</font>
		</p>
		<p>
				<font color="#008000">&lt;script runat="server" language="c#"&gt;<br />void Page_Load()<br />{<br />string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";<br />strConnection+=Server.MapPath("guestbook.mdb");<br />OleDbConnection objConnection=new OleDbConnection(strConnection);<br />OleDbCommand objCommand1 = new OleDbCommand("select * from guestbook",objConnection);<br />objConnection.Open();<br />dgrdMain.DataSource=objCommand1.ExecuteReader();//dgrdMain就是下面的DATAGRID的ID<br />dgrdMain.DataBind();<br />objConnection.Close();<br />}<br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;body&gt; <br />&lt;asp:DataGrid <br />id="dgrdMain" <br />cellpadding="1" <br />showheader="true" <br />borderwidth="0"<br />runat="server" <br />/&gt; <br />&lt;/body&gt;<br />&lt;/html&gt; <br />至于VB的版本，这次大家自己来试试吧：）<br />假设数据库是三个字段：id,aa,bb<br />显示的样子就如下：</font>
		</p>
		<p>
				<font color="#008000">id aa bb <br />1 werwe rewrwe <br />2 werwe rewrwe <br /> <br />我们一定觉得这种显示不满意，我们有两种显示的方式（需要包括在&lt;columns&gt;&lt;/columns&gt;中间）：<br />一、默认的列，我们可以选择不输出所有的字段还可以安排顺序：<br />&lt;asp:BoundColumn DataField="想要显示的字段名"&gt;<br />比如说我们想按照bb,aa来输出这个表，我们这么写<br />&lt;asp:DataGrid <br />id="dgrdMain" <br />cellpadding="1" <br />showheader="true" <br />autogeneratecolumns="false"<br />borderwidth="0"<br />runat="server"&gt;<br />&lt;columns&gt;<br />&lt;asp:boundcolumn datafield="bb"/&gt;<br />&lt;asp:boundcolumn datafield="bb"/&gt;<br />&lt;/columns&gt;<br />&lt;/asp:datagrid&gt;<br />注意使用了autogeneratecolumns="false"以后DATAGRID就不会自动输出所有字段了。<br />二、以模板列，我们可以定制每一个单元格的样式：<br />&lt;asp:TemplateColumn&gt;<br />&lt;itemTemplate&gt;<br />中间是一个表格，想怎么样就怎么样<br />&lt;/itemTemplate&gt;<br />&lt;/asp:DataGrid&gt; <br />或许你们要说怎么在表格中输出代码那，可以使用&lt;%# DataBinder.Eval(Container.DataItem,"字段名").ToString()%&gt;<br />下面看一个例子，我们所要做的就是把aa,bb两个字段放在一个单元格内显示，就好像下面一样：</font>
		</p>
		<p>
				<font color="#008000">1 werwe<br />rewrwe  <br />2 werwe<br />rewrwe  </font>
		</p>
		<p>
				<font color="#008000">我们这样写代码： <br />&lt;asp:DataGrid <br />id="dgrdMain" <br />cellpadding="1" <br />showheader="false" <br />autogeneratecolumns="false"<br />borderwidth="0"<br />runat="server"&gt;<br />&lt;columns&gt;<br />&lt;asp:boundcolumn datafield="ii"/&gt; 首先使用默认的显示方式显示ID<br />&lt;asp:TemplateColumn&gt; 再使用模板来显示后面一列（由AA,BB并列组成）<br />&lt;itemTemplate&gt;<br />&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;%# Container.DataItem("aa")%&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;tr&gt;<br />&lt;td&gt;&lt;%# Container.DataItem("bb")%&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt; <br />&lt;/itemTemplate&gt;<br />&lt;/asp:DataGrid&gt; <br />&lt;/columns&gt;<br />&lt;/asp:datagrid&gt; <br />今天就说到这里，明天我们来看一下DATAGRID的分页显示等功能<br />十天学会ASP.net之第九天<br />学习目的：学会用DATAGRID分页显示<br />虽然说DATAGRID的分页显示效率不怎么高，但是不管怎么说，它是最方便的分页显示，对于做一个留言簿还是相当简单实用的。对于启用分页功能还有一个重要要求，只能在DATADRID控件的数据源实现了ICOLLECTION接口的情况下才能启用分页功能，而DATAREADER没有这个接口，所以必须使用DATATABLE来代替。<br />&lt;script runat="server" language="c#"&gt;<br />void Page_Load()<br />{ <br />string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";<br />strConnection+=Server.MapPath("guestbook.mdb");<br />OleDbConnection objConnection=new OleDbConnection(strConnection);<br />OleDbDataAdapter objDataAdapter=new OleDbDataAdapter("select * from guestbook",objConnection);<br />DataSet objDataSet=new DataSet();<br />objDataAdapter.Fill(objDataSet);<br />dgrdMain.DataSource=objDataSet;<br />dgrdMain.DataBind();<br />}<br />void dgrdMain_PageIndexChanged(Object sender, DataGridPageChangedEventArgs e)<br />{<br />dgrdMain.CurrentPageIndex = e.NewPageIndex; <br />DataBind(); <br />} <br />&lt;/script&gt;<br />&lt;html&gt;<br />&lt;body&gt; <br />&lt;asp:DataGrid <br />id="dgrdMain" <br />cellpadding="1" <br />showheader="true" <br />borderwidth="0"<br />allowpaging="true" 启用分页功能<br />pagesize="3" 每一页显示三条记录<br />onpageindexchanged="dgrdMain_pageindexchanged " 调用第×页的函数为dgrdMain_PageIndexChanged()<br />runat="server" <br />/&gt; <br />&lt;/body&gt;<br />&lt;/html&gt; <br /> <br />--------------------------------------------------------------------------------<br />&lt;script runat="server" language="vb"&gt;<br />subPage_Load<br />dim objConnection as OleDbConnection<br />dim objDataAdapter as OleDbDataAdapter<br />dim objDataSet as DataSet<br />objConnection=new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source="+Server.MapPath("guestbook.mdb"))<br />objDataAdapter=new OleDbDataAdapter("select * from guestbook",objConnection)<br />objDataSet=new DataSet<br />objDataAdapter.Fill(objDataSet)<br />dgrdMain.DataSource=objDataSet<br />dgrdMain.DataBind()<br />end sub<br />sub dgrdMain_PageIndexChanged(sender as object,e as datagridpagechangedeventargs)<br />dgrdMain.CurrentPageIndex = e.NewPageIndex<br />DataBind<br />end sub<br />&lt;/script&gt; <br />&lt;html&gt;<br />&lt;body&gt; <br />&lt;asp:DataGrid <br />id="dgrdMain" <br />cellpadding="1" <br />showheader="true" <br />borderwidth="0"<br />allowpaging="true" 启用分页功能<br />pagesize="3" 每一页显示三条记录<br />onpageindexchanged="dgrdMain_pageindexchanged " 调用第×页的函数为dgrdMain_PageIndexChanged()<br />runat="server" <br />/&gt; <br />&lt;/body&gt;<br />&lt;/html&gt; <br />这样就是最简单的分页，我们可以用参数pagestyle-mode="nextprev/numericpages"来设定是显示上一页、下一页方式还是直接选择页面的数字方式来实现页面跳转。如果是前者我们可以用pagestyle-nextpagetext来设定包含下一页链接的文本，用pagestyle-prevpagetext来设定包含上一页链接的文本；如果是后者我们可以用PagerStyle-PageButtonCount来设定在使用省略号之前显示的页面编号数量（默认是10）<br />今天就说到这里，明天说一下SESSION和COOKIE。<br />十天学会ASP.net之第十天<br />学习目的：学会SESSION和COOKIE的使用<br />在各个网页间的变量传递和一些记录用户的登陆信息要用到SESSION和COOKIE。在ASP.NET中使用COOKIE比ASP中稍微麻烦一点，因为我们要申明变量。<br />首先看一下SESSION的使用，基本和ASP差不多<br />写入一个SESSION：<br />Session["username"])="aa";</font>
		</p>
		<p>
				<font color="#008000">--------------------------------------------------------------------------------<br />Session("username")="aa" <br />读取一个SESSINN： <br />string username= Session["username"];<br />--------------------------------------------------------------------------------<br />dim username=Session("username")<br />再来看一下COOKIE的写入： <br />DateTime dt=DateTime.Now; //需要&lt;</font>
				<a href="mailto:%@Import">
						<font color="#008000">%@Import</font>
				</a>
				<font color="#008000">Namespace="System"%&gt;，得到当前时间<br />HttpCookie mycookie=new HttpCookie("logname");//申明新的COOKIE变量<br />mycookie.Value="aa";//赋值<br />mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1));//设定过期时间为1天<br />Response.Cookies.Add(mycookie1);//写入COOKIE<br /> <br />--------------------------------------------------------------------------------<br />dim dt as DateTime<br />dt=DataTime.Now<br />dim mycookie as HttpCookie<br />mycookie=new HttpCookie("logname")<br />mycookie.Value="aa"<br />mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1))<br />Response.Cookies.Add(mycookie1)<br />看一下COOKIE的读取：<br />HttpCookie mycookie=Request.Cookies["username"]; <br />string username=mycookie.Value;</font>
		</p>
		<p>
				<font color="#008000">--------------------------------------------------------------------------------</font>
		</p>
		<p>
				<font color="#008000">dim mycookie as HttpCookie <br />mycookie=Request.Cookies["username"]<br />dim string=mycookie.Value<br />到此《十天学会ASP.NET》结束了，时间仓促，还请大家原谅写的不全，实际上我只是带大家入门，学会还要靠自己啊。</font>
		</p>
		<p>
				<font color="#008000">
				</font> </p>
<img src ="http://www.blogjava.net/zgghc/aggbug/93104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2007-01-11 11:13 <a href="http://www.blogjava.net/zgghc/articles/93104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#入门</title><link>http://www.blogjava.net/zgghc/articles/64779.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 21 Aug 2006 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/64779.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/64779.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/64779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/64779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/64779.html</trackback:ping><description><![CDATA[三、C#语言基础 
（一）数据类型 

应用程序总是要处理数据的，我们必须要让计算机了解需要处理什么样的数据，用什么方式进行处理，按什么格式保存数据等。这就需要了解程序设计语言的数据类型。 

1.值类型 

在学习各种类型以前，我们先提一下变量的概念，变量即是存储信息的基本单元，另一方面，我们也可以把变量理解为计算机内存中的一个存储空间。C#的值类型可以分为：简单类型、结构类型、枚举类型。 

简单类型是直接由一系列元素构成的数据类型。C#中为我们提供了一组已定义的简单类型。这些简单类型可分为：整数类型、布尔类型、字符类型和实数类型。 

（1）整数类型 

整数类型的变量的值为整数。C#中有九种整数类型：短字节型（sbyte）、字节型（byte）、短整型（short）、无符号短整型（ushort）、整型（int）、无符号整型（uint）、长整型（long）、无符号长整型（ulong）。这些整型类型在数学上的表示以及在计算机中的取值范围如下表所示。 

(图) 

（2）布尔类型 

布尔类型是用来表示一个事件或状态的“真”和“假”。我们知道，不管任何数据，在计算机的内部都是采用二进制方式处理和存储。布尔类型表示的逻辑变量只有两种取值：“真”或“假”，在C#中分别采用“true”和“false”表示。 

（3）实数类型 

浮点类型：数学中的实数不仅包括整数，而且包括小数。小数在C#中采用单精度（float）和双精度（double）。它们的差别在于取值范围和精度不同。 

单精度：取值范围在(^60090201a)^到(图)之间，精度为7位数。 

双精度：取值范围在(图)到(图)之间，精度为15到16位数。 

十进制类型（decimal）：是C#专门为我们定义的一种数据类型，主要用于方便我们在金融和货币方面的计算。C#通过提供这种专门的数据类型，使我们能够更快捷地设计这方面的应用程序。其取值范围从大约(图)到(图)的28到29位有效数字。 

当定义一个十进制变量并赋值给它时，使用m下标以表明它是一个十进制类型。如果省略了m下标，在变量被赋值之前，它将被编译器当作双精度数据类型来处理。下面是一个合法的赋值： 

decimal d_value=1.0m; 

（4）字符类型 

除了数字以外，计算机还需要处理的信息主要就是字符了。字符包括数字字符、英文字符、表达符号等，C#提供的字符类型采用了国际公认的Unicode字符集标准。一个Unicode的标准字符长度为16位，用它可以表示大多数的字符类型了。可以按下面的方法给一个字符变量赋值，如： 

char c=′A′; 

另外，我们还可以直接通过十六进制转义符（前缀＼x）或Unicode表示法给字符型变量赋值）（前缀＼u），用来在程序中指代特殊的控制字符。 

（5）结构类型 

在具体的程序设计中我们经常要把一组相关的信息存放在一起。把一系列相关的变量组织成为一个单一实体的过程，称为生成结构的过程。这个单一实体的类型我们就叫做结构类型，每一个变量称为结构的成员。结构类型的变量采用struct来进行声明。下面的程序代码说明定义一个通讯录记录结构(包括姓名、电话和地址)的定义。 

Struct PhoneBook{ 

public string name; 

public string phone; 

public string address; 

} 

PhoneBook p1; 

p1就是一个通讯录（PhoneBook）结构类型的变量。上面声明中的“public”表示对结构类型的成员的访问权限。对结构成员的访问通过结构变量名加上访问符“.”号，后跟成员的名称： 

p1.name=″tom″; 

结构类型包含的成员类型没有限制，可以相同也可不同。 

（6）枚举类型 

枚举（enum）实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。下面的程序代码声明了一个代表星期的枚举类型的变量。 

Enum WeekDay{ 

Sunday,Monday,Tuesday,Wednesday,Friday,Saturday 

}; 

WeekDay day; 

注意：枚举类型的变量在某一时刻只能取枚举中某一个元素的值。如，day这个表示“星期”的枚举的变量，它的值要么是Sunday，要么是Monday或其他的星期元素，但它在一个时刻只能代表具体的某一天，不能既是星期二，又是星期三。 

Day=Tuseday; 

按照系统默认，枚举中的每个元素都是整型（int），且第一个元素删去的值为0，它后面的每一个连续的元素的值按加1递增。在枚举中，也可以给元素直接赋值。下面的程序代码把星期一的值设为1，其后的元素的值分别为2，3…… 

enum WeekDay{ 

Sunday=1,Monday,Tuesday,Wednesday,Friday,Saturday 

}; 

为枚举类型的元素所赋值的值的类型限于long、int、short和byte等整数类型。


2.引用类型 

在这里，引用的含义是该类型的变量不直接存储所包含的值，而是指向它所要存储的值。即引用类型存储实际数据的引用值的地址。C#中的引用类型有四种：类、代表、数组和接口。 

（1）类 

类是面向对象编程的基本单位，是一种包含数据成员、函数成员和嵌套类型的数据结构。类的数据成员有常量、域和事件。函数成员包括方法、属性、索引指示器、运算符等。类和结构同样都包含了自己的成员，但它们之间最主要的区别在于：类是引用类型，而结构是值类型。 

类支持继承机制，通过继承，派生类可以扩展基类的数据成员和函数成员，进而达到代码重用和设计重用的目的。下面介绍两个经常用到的类： 

object类：它是所有其他类型的基类，C#中的所有类型都直接或是间接地从object类中继承。因此，对一个object的变量可以赋予任何类型的值。 

Int x=25; 

object obj1; 

obj1=x; 

object obj2=′A′; 

对object类型的变量声明采用object关键字，这个关键字是在.NET平台中为我们提供的预定义的名字空间System中定义的，是类System.Object的别名。 

String类：专门用于对字符串的操作。同样，这个类也是在.NET平台中为我们提供的预定义的名字空间System中定义的，是类System.String的别名。 

字符串在实际中应用非常的广泛，在类的定义中封装了许多内部的操作，我们只要简单地加以利用就可以了。可以用加号“+”合并两个字符串，采用下标从字符串中获取字符等。 

String String1=″Welcome″; 

string String2=″Welcome″+″everyone″; 

char c=String1［0］; 

bool b=(String1==String2); 

（2）代表 

在C#中取消了C和C++中的指针的这个概念。而代表实际上相当于是C#中的函数指针原型，与指针不同的是，代表在C#中是类型安全的。 

在声明代表时，只需要指定代表指向的原型的类型，它不能有返回值，也不能带有输出类型的参数。如我们可以声明一个指向int类型函数原型的代表： 

delegate int MyDelegate(); 

如果我们声明了自己的一个代表，那么它就是对系统定义的类System.deldgate的一个扩展。 

（3）数组 

在进行批量处理数据的时候，我们要用到数组。数组是一组类型相同的有序数据。数组按照数组名、数据元素的类型和维数来进行描述。C#中提供Ststem.Array类是所有数组类型的基类。 

数组的声明格式为： 

non-array-type［dim-separators］ array-instance name; 

比如我们声明一个整数数组： 

int［］arr; 

在定义数组时，可以预先指定数组元素的个数，这时在“［］”中定义数组的元素个数，它的个数可以通过数组名加圆点加“Length”获得。而在使用数组时，可以在“［］”中加入下标来取得对应的数组元素。C#中的数组元素的下标是从0开始的，以后递增。 

在C#中数组可以是一维的也可以是多维的，同样也支持矩阵和参差不齐的数组。其中一维数组最为普遍，用得也最多。 

Class Tese 

{ 

static void Main(){ //可动态生成数组的长度 

string［］ a1; //一维数组string 

string［］ a2; //二维数组string 

string［］ a3; //三维数组string 

} 

} 

（4）接口 

接口定义了一个协议（conrtact）。一个类或结构要实现接口就必须坚持这种协议。接口可以包括方法、属性、索引和事件作为成员。下面的程序代码说明了一个接口，它包含一个索引、一个事件E、一个方法F和一个属性P。 

Interface Iexampie 

{ 

string this［int index］{get; ste;}＼ 

event EventHandler E; 

void F(int value); 

string P{get; set;} 

}

<img src ="http://www.blogjava.net/zgghc/aggbug/64779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2006-08-21 13:49 <a href="http://www.blogjava.net/zgghc/articles/64779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VB中调用CHM  帮助的几种方法</title><link>http://www.blogjava.net/zgghc/articles/63495.html</link><dc:creator>牧月人</dc:creator><author>牧月人</author><pubDate>Mon, 14 Aug 2006 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/zgghc/articles/63495.html</guid><wfw:comment>http://www.blogjava.net/zgghc/comments/63495.html</wfw:comment><comments>http://www.blogjava.net/zgghc/articles/63495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zgghc/comments/commentRss/63495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zgghc/services/trackbacks/63495.html</trackback:ping><description><![CDATA[在VB中调用CHM  帮助的几种方法    
 
一个应用程序不论编制得如何完美，在很多情况下用户还是会对如何使用它提出问题。  Visual  Basic  提供了对两种不同帮助系统的支持：传统的  Windows  帮助系统  (WinHelp)和新的  HTML  帮助（CHM帮助）。当我们制作好帮助文件后，就需要在程序的适当位置编写代码进行调用，本文将讨论几种在程序中调用CHM帮助文件的方法。    
方法一　使用F1键：  
这种方法最简单，只需如下代码即可：  
Private  Sub  Form_Load()    
App.HelpFile  =  app.path  &  "\help.chm"  '调用与主程序同目录下的help.chm帮助文件，按F1键调用  
End  Sub  
 
方法二  使用SendKeys方法：  
Private  Sub  Form_Load()    
App.HelpFile  =  app.path  &  "\help.chm"    
End  Sub    
private  Sub  CmdHelp_Click()    
SendKeys  "{F1}"  '发送击键到活动窗口    
End  Sub  
 
方法三  使用Shell函数：  
private  Sub  CmdHelp_Click()  
Shell  "hh.exe  help.chm",  vbNormalFocus  'help.chm为指定的帮助文件，可包含路径。  
End  Sub  
 
方法四  使用HtmlHelp函数：  
先声明如下API：  
Option  Explicit  
Private  Declare  Function  HtmlHelpA  Lib  "hhctrl.ocx"  (ByVal  hwndCaller  As  Long,  ByVal  pszFile  As  String,  ByVal  uCommand  As  Long,  ByVal  dwData  As  Long)  As  Long    
'hwndCaller指定调用者的窗口，pszFile指定要调用的文件，uCommand是发送给  HtmlHelp的命令，dwData是uCommand的参数。    
然后在过程中调用：  
private  Sub  CmdHelp_Click()  
dim  i  as  string  
i  =  app.path  &  "\help.chm"  '用变量i记录与主程序同目录下的help.chm帮助文件  
HtmlHelpA  Form1.hWnd,  i,  0,  0  
End  Sub  
 
方法五  使用ShellExecute函数：  
先声明如下API：  
Option  Explicit  
'声明API函数用于异步打开一个文档  
Private  Declare  Function  ShellExecute  Lib  "shell32.dll"  Alias  "ShellExecuteA"  (ByVal  hwnd  As  Long,  ByVal  lpOperation  As  String,  ByVal  lpFile  As  String,  ByVal  lpParameters  As  String,  ByVal  lpDirectory  As  String,  ByVal  nShowCmd  As  Long)  As  Long  
Private  Const  SW_SHOWNORMAL  =  1  
然后在过程中调用：  
private  Sub  CmdHelp_Click()  
dim  a  as  long  
Dim  b  As  String  
b  =  App.Path  &  "\help.chm"  '用变量b记录与主程序同目录下的help.chm帮助文件  
a  =  ShellExecute  (0,  "open",  b,  "",  "",  SW_SHOWNORMAL)  
End  Sub  
以上五种方法各有优缺点，从代码的简单上讲，建议使用第二种方法。从功能上讲，建议使用第五种方法，因其不只用于打开CHM帮助文件，还可用同样的格式打开、打印或查找一个文件或文档（参见该API的说明资料）。    

<img src ="http://www.blogjava.net/zgghc/aggbug/63495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zgghc/" target="_blank">牧月人</a> 2006-08-14 15:47 <a href="http://www.blogjava.net/zgghc/articles/63495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>