今天学的知识整理:
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.youkuaiyun.com/ilovewebservice/article/details/5989646
5、线程间通信
//方法一:通过结构体传递数据,也可以通过公共的全局变量实现
//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对应。以此类推。