1.Directory
//File 文件
Path 路径
FileStream StreamReader StreamWriter 流
Directory 文件夹 目录
//创建文件夹
Directory.CreateDirectory(@"C:\a\b");
Console.WriteLine("创建成功");
Console.ReadKey();
//删除文件夹,文件夹若不是空的,会抛异常,需要再后面加,true强行删除
Directory.Delete(@"c:\a",true);
Console.WriteLine("删除成功");
Console.ReadKey();
//剪切文件夹
Directory.Move(@"c:\a",@"C:\Users\SJD\Desktop\new");
Console.WriteLine("剪切成功");
Console.ReadKey()
//获得指定文件夹下所有的文件的全路径,返回一个string类型的数组
string[] path = Directory.GetFiles(@"C:\Users\SJD\Desktop\picture");
for (int i = 0; i < path.Length; i++)
{
Console.WriteLine(path[i]);
}
Console.ReadKey();
//获得指定文件夹下所有图片的全路径,返回一个string类型的数组(*.格式,没有的也不会抛异常)
string []path = Directory.GetFiles(@"C:\Users\SJD\Desktop\picture", "*.jpg");
for (int i = 0; i < path.Length; i++)
{
Console.WriteLine(path[i]);
}
Console.ReadKey();
//获得指定文件夹下所有文件夹的路径
string []path= Directory.GetDirectories(@"C:\Users\SJD\Desktop\picture");
for (int i = 0; i < path.Length; i++)
{
Console.WriteLine(path[i]);
}
Console.ReadKey();
//判断指定文件夹是否存在,并在目录下创建100个子目录
if(Directory.Exists(@"C:\Users\SJD\Desktop\new"))
{
for (int i = 0; i < 100; i++)
{
Directory.CreateDirectory(@"C:\Users\SJD\Desktop\new\" + i);
}
}
Console.WriteLine("OK");
Console.ReadKey();
Directory 操作文件夹
CreateDirectory 创建文件夹
Delete 删除文件夹
Move 剪切文件夹
Exists 判断文件夹是否存在
GetFiles 获得指定文件夹目录下所有文件的全路径
GetDirectory 获得指定文件夹目录下所有文件夹的全路径
2.浏览器控件 WebBrowser
Url
string text = textBox1.Text;
Uri uri = new Uri("http://"+text);
webBrowser1.Url = uri;
3.ComboBox 下拉框控件
DropDownStyle:控制下拉框的外观样式
名字:cbo+...
private void Form1_Load(object sender, EventArgs e)
{
//程序加载的时候 将年份添加到下拉框中
//获得当前的年份
int year = DateTime.Now.Year;
for (int i = year; i >= 1949; i--)
{
cboYear.Items.Add(i + "年");
}
}
/// <summary>
/// 当年份发生改变的时候 加载月份
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cboYear_SelectedIndexChanged(object sender, EventArgs e)
{
//添加之前应该清空之前的内容
cboMoon.Items.Clear();
for (int i = 1; i <= 12; i++)
{
cboMoon.Items.Add(i + "月");
}
}
/// <summary>
/// 当月份发生改变的时候 加载天
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cboMoon_SelectedIndexChanged(object sender, EventArgs e)
{
cboDay.Items.Clear();
int day = 0;//定义一个变量来存储天数
//获得月份
string strMoon = cboMoon.SelectedItem.ToString().Split(new char[] { '月' }, StringSplitOptions.RemoveEmptyEntries)[0];
string strYear = cboYear.SelectedItem.ToString().Split(new char[] { '年' }, StringSplitOptions.RemoveEmptyEntries)[0];
//MessageBox.Show(cboMoon.SelectedItem.ToString());
int year = Convert.ToInt32(strYear);
int moon = Convert.ToInt32(strMoon);
switch(moon)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: day = 31;
break;
case 2:
if((year%4==0&&year%100!=0)||(year%400==0))
{
day = 29;
}
else
{
day = 28;
}
break;
default:day = 30;
break;
}
for (int i = 1; i <=day; i++)
{
cboDay.Items.Add(i+"日");
}
}
4.点击更换图片
1)、在程序加载的时候,将制定图片文件夹中所有的图片文件名读取到listBox中。
5.剪刀石头布
石头 1 剪刀 2 布 3
玩家赢了: 1-2=-1 2-3=-1 3-1=2
平手: 相减=0
另外一种情况:电脑赢了
比较的时候必须给我返回一个数字
构思
1.在form1上创建6个label(文字),3个button(按钮)
label1(显示 玩家出:) label2(Name改为 lblPlayer(玩家)) label3(显示 电脑出:) label4(Name改为 lblComputer(电脑))
label5(显示 裁判) label6(Name改为 lblResult(结果))
label1和label3 作为玩家和电脑的名称 label2和label4 作为显示玩家和电脑出什么的结果
button1,2,3分别显示为石头,剪刀,布。并且将它们的Name改为btnStone,btnCut,btnBu
2.先做 点击石头的方法
把石头赋值给一个string 类型的字符串str
再把str赋值给玩家。当点击“石头”按钮时,让石头显示在玩家出:的 后面。 lblPlayer.text=str;()
3.做一个玩家玩游戏的方法
创建一个类 Player
在类中创建一个猜拳的方法,放入出拳的string类型,返回Int类型(后面根据数字相减判断) public int ShowFist(string fist)
首先创建一个int类型的num,初值赋予0, 返回num return num;
再在中间创建switch-case类型判断出拳的三种形式返回的int值
switch(fist)
{
case "石头":num = 1;
break;
case "剪刀":num = 2;
break;
case "布":num = 3;
break;
}
4.做一个电脑玩游戏的方法
创建一个类 Computer
在类中创建猜拳的方法,和玩家的猜拳方法一样,但是不用放入string类型的值 public int ShowFist()
首先创建一个random的随机数 random r=new random();
把r的随机数限定在1-3,赋值给一个Int类型的rNumber int rNumber=r.Next(1,4);
现在没有一个东西来存储电脑出的石头,剪刀,布
所以需要单独声明一个字段或属性来存储出的东西,然后赋值给lblComputer
创建一个自动属性来存储出的拳头
public string Fist
{
get;
set;
}
用switch-case来将随机出来的1,2,3判断,把石头,剪刀,布赋值给this.Fist
switch(rNumber)
{
case 1:this.Fist = "石头";
break;
case 2:this.Fist = "剪刀";
break;
case 3:this.Fist = "布";
break;
}
最后返回int 类型的rNumber和玩家相减做判断 return rNumber
5.做一个判断输赢的方法
创建一个类 CaiPan
创建一个静态类 省的创建对象new的那一步,返回3种结果,赢,输,平。可以返回string ,int等等,因为要复习枚举,就用枚举来做
创建一个枚举,把3种结果写进去
public enum Result
{
玩家赢,
电脑赢,
平局
}
静态类写做 public static Result Judge(int playerNumber,int computerNumber)
返回一个Result的枚举类型,传入int类型的玩家和电脑数字来相减判断
用If来进行判断
public static Result Judge(int playerNumber,int computerNumber)
{
if(playerNumber-computerNumber==-1||playerNumber-computerNumber==2)
{
return Result.玩家赢;
}
else if(playerNumber-computerNumber==0)
{
return Result.平局;
}
else
{
return Result.电脑赢;
}
}
6.返回点击石头的方法
接着 先创建一个玩家对象,调用玩家玩游戏的方法,传入string 类型的str,返回一个Int类型的玩家数字
Player player = new Player();
int playerNumber= player.ShowFist(str);
再创建一个电脑对象,调用电脑玩游戏的方法,返回一个Int类型的电脑数字
Computer cpu = new Computer();
int cupNumber= cpu.ShowFist();
给显示界面的lblComputer赋值,让他能显示出什么拳。
lblComputer.Text = cpu.Fist;
调用caipan类的静态方法,比较输赢,返回一个result类型的res结果
Result res= CaiPan.Judge(playerNumber, cpuNumber);
把结果res转为string类型赋值给lblResult,显示在界面的裁判结果上
lblResult.Text = res.ToString();
7.把玩游戏封装成一个方法PlayGame,分别给剪刀,石头
封装
lblPlayer.Text = str;
Player player = new Player();
int playerNumber= player.ShowFist(str);
Computer cpu = new Computer();
int cpuNumber= cpu.ShowFist();
lblComputer.Text = cpu.Fist;
Result res= CaiPan.Judge(playerNumber, cpuNumber);
8.完成
6.打开文件对话框
//点击弹出对话框
OpenFileDialog ofd = new OpenFileDialog();
//设置对话框的标题
ofd.Title = "请选择要打开的文本文件哟╭(╯3╰)╮";
//设置对话框可以多选
ofd.Multiselect = true;
//设置对话框的初始目录
ofd.InitialDirectory = @"C:\Users\SJD\Desktop";
//设置对话框的文件类型
ofd.Filter = "文本|*.txt|媒体|*.wav|图片|*.jpg|所有|*.*";
//展示对话框
ofd.ShowDialog();
//获得在打开对话框中选中文件的路径 返回给string类型全路径
string path = ofd.FileName;
//判断路径为空则返回
if(path=="")
{
return;
}
using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 5];
//实际读取到的字节数
int r= fsRead.Read(buffer, 0, buffer.Length);
textBox1.Text= Encoding.Default.GetString(buffer, 0, r);
}
7.保存文件对话框
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择要保存的路径";
sfd.InitialDirectory = @"C:\Users\SJD\Desktop";
sfd.Filter = "文本文件|*.txt|所有文件|*.*";
sfd.ShowDialog();
string path = sfd.FileName;
if(path=="")
{
return;
}
using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = Encoding.Default.GetBytes(textBox1.Text);
fsWrite.Write(buffer, 0, buffer.Length);
}
MessageBox.Show("保存成功");
8.字体和颜色
FontDialog fd = new FontDialog();
fd.ShowDialog();
textBox1.Font= fd.Font;
ColorDialog cd = new ColorDialog();
cd.ShowDialog();
textBox1.ForeColor= cd.Color;
9.进程
我们可以把计算机中每一个运行的应用程序都当做是一个进程。
而一个进程又是由多个线程组成的。
//获得当前程序中所有正在运行的进程
Process[]pros= Process.GetProcesses();
foreach (var item in pros)
{
//结束当前程序中所有进程
//item.Kill()
Console.WriteLine(item);
}
Console.ReadKey();
//通过进程打开一些应用程序
Process.Start("calc");
Process.Start("mspaint");
Process.Start("notepad");
Process.Start("iexplore", "http://www.baidu.com");
//通过一个进程打开指定的文件
//进程打开实例
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\SJD\Desktop\AE.txt");
//第一:创建进程对象
Process p = new Process();
p.StartInfo = psi;
p.Start();
10.单线程给我们带来的问题
单线程(主线程)去做一件事情,如果还没做完,再去做另一件事情就做不了,会出现假死的情况
单线程只能去做单一的事情,一复杂就没办法了
//创建一个线程去执行这个方法
Thread th=new Thread(Test);
//标记这个线程准备就绪了,随时可以被执行。具体什么时候执行这个线程,由Cpu决定
th.Start();
***前台线程:只有所有的前台线程都关闭才能完成程序关闭。
***后台线程:只要所有的前台线程结束,后台线程自动结束。
默认情况下,新创建的线程都叫前台线程
所以那个程序要设置为后台线程
//将线程设置为后台线程
th.IsBackground=true;
th.Start();
在.Net下,是不允许跨线程的访问。
可以让应用程序不去检查有没有跨线程访问
//取消跨线程的访问
control是win所有空间的基类
control.checkforillegalcrossthreadcalls=false;
//当你点击关闭窗体的时候,判断新线程是否为null
If(th !=null)
{
//结束这个线程 线程被abort就不能再被start了
th.abort();
}
无法通过代码去操作CPU
运行时----调试---窗口---输出