今天学的知识整理:
1、ProgressBar控件的应用
Maximum最大值,Minimum最小值,Value当前的进度值
//调用PerformStep方法,设置step步长规定每次增加进度条
方法一:通过循环实现 progressBar1.Maximun=100; progressBar1.Minimun=1; progressBar1.Step = 10; for (int i = 1; i < 100; i++) { progressBar1.Value = i; Thread.Sleep(100);//100ms通过线程休眠实现平滑过渡的效果 } 方法二:通过PerformStep方法实现 progressBar1.Maximun=100; progressBar1.Minimun=1; progressBar1.Step = 1; for (int i = 1; i <= 100; i++) { progressBar1.PerformStep(); }//实际操作中可结合Timer控件考虑综合功能的开发
2、文件的读出和写入
2.1 读文件:文件的读取 StreamReader 和FileStream类,用到的方法有ReadAllText(),ReadAllLines(),ReadAllBytes()读取文件。
StreamReader objReader = new StreamReader(@"D:\30天实例开发光盘\huihui.txt", UnicodeEncoding.GetEncoding("GB2312")); //@放在字符串前使用,意思是声明这个字符串中没有转义字符。例如@"\r",表示的不是换行了,而是字符串\r string sLine = ""; ArrayList arrText = new ArrayList();//需要添加Collections命名空间 while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null) arrText.Add(sLine); } objReader.Close(); foreach (string sOutput in arrText) {// \r\n与\n是有区别的。 如果要通用的则是\r\n,因为有些编辑器它不认\n richTextBox1.Text += sOutput + "\r\n";// 一定要有“+”号否则文本只显示只有最后一行数据 } //默认声明的string类型的变量和属性以及字段在未赋值的情况下均为null,这个null不仅仅表示为无字符,更表示为空的引用。string userName;此时判断userName是否为空应该是if(userName==null)而不是if(userName==“”),并且使用userName.Equals(null)或userName.Equals(“”)均为错的,因为此时userName是个空引用,根本无法调用Equals()方法。 //所有控件的Text属性的在未赋值的情况下是空值(""), 而不是null.可以调用Equals()方法。
2.1 写文件:文件的写入,基类库提供WriteAllText()、WriteAllBytes(),WriteAllLines()覆盖以前的文件。计数器时可以应用这一覆盖特性进行更新数值。
方法一:通过字符串数组实现: string[] phrase = { "欢迎您!","您好!你真漂亮!"}; File.WriteAllLines("demo.txt",phrase); 方法二:通过文本框控件实现 File.WriteAllText("DEMO.txt", textBox1.Text);
3、目录和文件管理
Directory 和File类只有静态方法,可以对应创建、删除文件夹,文件
DirectoryInfo和FileInfo主要有文件的创建时间和大小,可以实例化,有公共方法、公共属性、构造函数。
3.1 创建文件夹
void CreateDiretory() { try { if (Directory.Exists(textBox1.Text)) { label1.Text = "该文件夹已经存在!"; return; } else {//创建文件夹 DirectoryInfo dirInfo = System.IO.Directory.CreateDirectory(textBox1.Text); label1.Text = "创建成功!创建时间为:" + Directory.GetCreationTime(textBox1.Text); } } catch (Exception ee) { label1.Text = "创建失败!原因:" + ee.ToString(); } }
3.2 删除文件夹
try { if (!Directory.Exists(textBox1.Text)) { label1.Text = "给文件夹不存在!"; return; } else { Directory.Delete(textBox1.Text); label1.Text = "删除成功!"; } } catch (Exception ee) { label1.Text = "删除失败!原因是:" + ee.ToString(); }
3.3移动文件夹
void MoveDiretory() { try { if (!Directory.Exists(textBox1.Text)) { label1.Text = "给文件夹不存在!"; return; } if (Directory.Exists(textBox2.Text)) { label1.Text = "目标文件夹已经存在!"; return; } Directory.Move(textBox1.Text, textBox2.Text); label1.Text = "文件夹移动成功!已经从" + textBox1.Text + "移动到" + textBox2.Text; } catch (Exception ee) { label1.Text = "移动失败!原因" + ee.ToString(); } }
3.4 检索计算机上逻辑驱动器盘符
string[] drives = Directory.GetLogicalDrives(); for (int i = 0; i < drives.Length; i++) { listBox1.Items.Add(drives[i]); }
4、XML文件的增加、修改、读节点内容
XML与HTML区别:XML用于表示数据,而不只是规定数据的显示格式。标识数据可以看出其中的意义。XML能指明意义的数据机制。
//每执行一次,增加一个根节点下的author节点,节点内容为netname,该节点包含子节点name void AddNode() { XmlDocument doc = new XmlDocument(); XmlTextReader reader = new XmlTextReader("book.xml"); doc.Load("book.xml"); XmlElement root = doc.DocumentElement; XmlElement tagMsg = doc.CreateElement("author"); XmlElement tagName = doc.CreateElement("name"); tagMsg.InnerText = "authorname"; tagName.InnerText = "detailname"; tagMsg.AppendChild(tagName); root.AppendChild(tagMsg); reader.Close(); doc.Save("book.xml"); }
//修改节点内容属性值 void ModifyNode() { XmlDocument doc = new XmlDocument(); doc.Load("book.xml"); XmlNode xmlauthor = doc.SelectSingleNode("/root/author"); xmlauthor.Attributes["name"].InnerText="慧慧"; doc.Save("book.xml"); }//读节点内容属性值 void ReadNode() { XmlDocument doc = new XmlDocument(); doc.Load("book.xml"); XmlNode xuser = doc.SelectSingleNode("root/book/bookname"); //string flag = xuser.Attributes["bookname"].InnerText; label1.Text =xuser.InnerText; } //具体参见:http://blog.csdn.net/ilovewebservice/article/details/59896465、线程间通信
//方法一:通过结构体传递数据,也可以通过公共的全局变量实现 //public struct threadData//利用结构体传递线程间信息 //{ public string Msg;}//要传送的数据放在Msg中 //方法二 :通过类传递数据 class MyThreadClass { //一个类来传送数据,定义构造类中一个字段,用于保存要传递的数据 private string Msg; public MyThreadClass(string Msg) { this.Msg = Msg; } public void ThreadMain() { Console.WriteLine("字段Msg的值是:{0}", Msg); } } 调用程序:MyThreadClass o1 = new MyThreadClass("我是线程1,优先级Highest!"); Thread t1 = new Thread(o1.ThreadMain); t1.Priority = ThreadPriority.Highest;//设定线程优先级 t1.Start(); //方法三:通过静态方法 Thread t = new Thread(ThreadMain);//ThreadMain它必须是静态方法 t.Start(); Console.WriteLine("主线程"); static void ThreadMain() { Console.WriteLine("线程2"); } Console.Read(); //该语句的作用等待新内容读入,从而避免运行后的dos界面窗口一闪而过补充:由于线程的优先级是动态分配的,所以程序员也无法知道启动的线程是哪一个先执行。
如果有一个线程一直需要使用CPU,而且又不等待资源,那么它的优先级就会降低。如果某一个线程在等待资源,那么它的优先级就会上升。可以指定优先级进行控制。
6、注册表类:在Windows 操作系统中,有一个控制操作系统功能和软件硬件工作的数据库文件,就是注册表。它以树形结构存放的多层次。运行窗口中输入命令regedit
(1)对注册表操作,用到Registry和RegistryKey类,这两个类不允许被继承。
(2)RegistryKey类表示一个注册表项,该方法可以浏览子键,创建新键,读取或修改键中的值。
Registry能对注册表键进行单一的访问,执行简单的操作。
(3)注册表与系统稳定性有关,不可胡乱修改,对注册表事先进行备份,再进行练习修改实例。
Registry类提供7个公共静态域,分别与系统相对应。如Registry.ClassRoot和HKEY_CLASSES_ROOT对应。以此类推。