C#OOP笔记

第一章Microsoft.NET(了解)

1.0 Microsoft.NET的概述

微软:操作系统,办公软件,数据库,.net

.net 2000年微软公司向全球宣布其革命性的软件和服务平台

必须依赖Microsoft 否则用不了微软的产品

1.1为什么要使用.net框架

C#程序可以在不同平台(Pad、 Phone、 PC) 的环境中运行吗? 使用C#程序可以调用VB.NET开发的程序吗?

可以同时开发多个程序 有大量的类库

.net Framework版本

1.0 1.1 2.0 3.0 3.5 4.0 4.5

1.2.net 框架的魅力

面向对象编程

提高软件可复用,可扩展,易维护性,灵活性

强大的动态web支持

DELL官网销售网站,中国海关,Myspace ,火车定票系统 (Microsoft框架开发的网页)开发速度快

1.3.net Framework框架概述

.NET战略的基础框架 .NET程序的运行环境 强大的类库

1.5.Microsoft.NET框架两个组成部分

ADO.NET的组件:

\1. DataSet

\2. Framework数据提供程序

.NET的组件

\1. 公共语言运行时CLR

\1. 框架类库FCL

2.0.NET框架核心

vb.net c# f# ironRuby others ...语言

.net Framework类库(FCL)

公告语言运行时 (CLR) 对各种语言进行统一

操作系统

2.1.net框架组件

img

 

使用不同语言整合 公共语言运行时 他交给CLS和CTS整合 可以招收不同的开发人员开发程序(Java不可以)

2.2公用语言运行时

CLR:公共语言运行时 提供所有.NET应用程序运行的环境

VB语言F#语言------>Microsoft.NET编译中间语言代码(MSIL)-------->即使编译器(JIT)--->平台专用语言--->代码被执行 ===一共编译两次 MSIL代码 = 即使编译器

2.3公共运行时的两个组成部分(掌握)

CTS(公告语言运行时)

称为通用类型系统 定义了在IL中的的数据类型

CLS(不同的语言整合)

称为公共语言规范 包括几种面向对象的编程语言的通用功能

2.4.net类库

img

 

使用泛型 System.Collections.Generic 对文件的基本操作 System.I0 对网络协议进行编程 System.Net 对数据库的访问 System.Data 开发Windows应用程序 System.Windows.Forms 对GD|+基本图形的操作 System.Drawing

2.5总结

ADO.NET的组件: 1、DataSet 2、Framework数据提供程序

.NET的重要组件: 1、公共语言运行时CLR 2、框架类库FCL

公共语言运行时CLR的组成部分: 1、CTS通用类型系统 2、CLS公共语言规范

C#程序编译过程 VB语言F#语言(各种语言)------>Microsoft.NET编译中间语言代码(MSIL)-------->即使编译器(JIT)--->根据不同的平台生成平台的专用语言--->代码被执行 ===一共编译两次 MSIL代码 = 即使编译器 第一次编译:各种语言整合 第二次编译:根据不同的平台生成平台的专用语言

3.0面向对象

3.1封装

是面向对象3三大特征:之一 一个不可分割的独立实体 隐藏内部的细节 保留对外接口 通过访问修饰符授权

将字段封装成prviate

3.2封装-类

类时一个最基本的封装

3.3封装的好处(掌握)

保证数据安全性 提供清晰的对外接口 类内部实现可以任意修改,不影响其他类

3.5快速入门

//创建类的三步 1、写类名 2、写属性---> 属性类型属性名称; 3、写方法

//使用类的三步 创建对象给属性赋值 调用对象方法 1、实例化对象(创建对象) 类名称 引用=new 类名称(); 2、为属性赋值 对象名称.属性名=值; 3、调对象方法 对象名称,方法名();

3.6完整属性

private string_ name; 11姓名 public string Name { get{ return_ name; }//删除只能写入 set{ _ name = value; }//删除只能读取

}

优点:如果不使用get 可以删除

3.6自动属性(掌握) 首字母大写 快捷键prop+tab+tab

public string Name {get;set;}

自动属性缺点:get set一个都不能少

警告:字段名小写,属性名大写

4.0案例魔兽登陆注册

/*//**发现类 用户user //发现属性(注册,增加,修改,**查询列表) 姓名name,身份证号idenitiyNum,密码password,**邮箱email //**发现方法 //**封装*/

//**属性 /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 身份证号 /// </summary> public string IdenitiyNum { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// 邮箱 /// </summary> public string Email { get; set; }

           *//mLogin**窗口*

//**定义数组 //**初始化数组 //**加载事件 //**单击登陆事件 //..

第二章深入C#数据类型(理解)

1.0 值类型

1.0.1 基本数据类型

数据类型Java最小值和最大值范例
整形 int 小-2,147,483,648 大2,147,485,647  
浮点型 float 小 32768 大32767  
双精度型 double 小 大  
布尔型 bool true false  
枚举类型 枚举    
字符串 string 无限  
long long 小-9,223,372,036,854,775,808 大9,223,372,036,854,775,807  
字符 char 1个字符  
字节 byte 1个字节  

1.0.2 如何判断是值类型或引用类型:根据长度大小 值类型的大小有限,

值类型:大小有限制

引用类型:没有限制

值类型给值类型赋值=复制

 

1.1 值类型的特点:

会在内存中开辟一个空间,

值类型一个地方改变另一个地方不会改变

1.2 引用类型

1.2.1 引用类型的特点

引用类型一个地方改变另一个地方也会改变

引用类型的复制:地址的赋值

1.2.3 引用类型的内存空间

new一个对象会开辟2个空间

• 地址空间

• 数据空间

 

1.5 结构struct(理解)

将引用类转换成值类型

给public 后面的class 改为struct

 

1.5.3 结构的特点

\1. 在结构中不能有初始化的字段

\2. 值类型提前速度快,引用类型性能低,但是局限造成内存溢出

\3. 引用类型节省内存,值类型浪费内存并且能造成内存溢出

小提示,在企业开发中,一般都追求内存,不追求性能,内存能省则省

\4. 使用了struct结构,可以不用new(如int,double....使用其他报错)

img

 

1.6 转型

其他转string 3种方法

\1. Convert.ToString();

\2. num.TO=oString();

\3. String.Format();

特点: 转型性能低(尽量少转)

1.6.1 装箱,拆箱

值类型转引用类中 = 装箱

引用类型转值类型 = 拆箱

小提示(装拆箱在实际开发中尽量少用)

警告:

`引用类型一个地方改变另一个地方也会改变`

引用类型一个地方改变另一个地方也会改变

1.6.2 ref转引用类型

在基本类型前面增加ref

1.6.5 案例:

项目经理评分:

/* 分析: 发现类:员工类 属性:姓名,工号,年龄,评价judeg,得分source 方法:无 封装类: */

 

1.7 总结

掌握部分
值类型,引用类型,
值类型的特点:
引用类型的内存空间:
引用类型的特点:
结构的特点:

 

第三章 集合(掌握)

1.0 集合的概念:

• 集合原本是数学上的一个概念,表示一组具有某种性质的数学元素

• 引用到程序设计中表示一组具有相同性质的对象。集合好比容器,将一系列相似的组合一起,是一个特殊的类,和数组一样,可以通过索引访问集合成员,不同的是,集合的大小可以动态调整,可以在运行时添加或删除元素。

• 集合中包含的对象称为集合元素。集合分为泛型集合类和非泛型集合类,泛型集合类一般位于System.Collections.Generic名称空间,非泛型集合类位于System.Collections名称空间。此外,System.Collections.Specialized名称空间中也包含一些有用的集合类。

1.1 为什么要使用集合:

数组的局限性:

数组的长度空间是固定的,每次有一个新的元素,就要重写创建一个数组,若吧数组的长度定义很大,很浪费内存,

缺点:调整大小困难,增加元素困难,删除元素时位置不会补齐位置就空了,

优点:提取速度快

解决办法:集合

1.2 ArrayList集合(不推荐使用)

所有的集合都是可动态维护长度的集合

跟数组一样拥有索引,可以根据索引查询元素删除元素,跟数组一样下标从0开始,删除数据自动补齐

性能:提前速度慢(但可以忽略不记)

装拆箱性能太低了

类型不安全

1.2.1 快速入门(一般不使用详细在下面)

\1. :手动引入命名空间

– using System.Collections;

\2. :实例化对象

\3. :使用集合,操作元素

– 增加元素:ArrayList.Add(Object value);//返回值索引位置

– 访问元素:(类型转换比如String)ArrayList[索引];

– 删除元素:

– 插入数据

1.3 泛型集合

1.3.1 List<泛型>集合(常用掌握)

list集合是一个类型安全的集合

List<类型> list = new List<类型>();

  1. :实例化对象

List<泛型> 变量 = new List(这里也可以指定长度);

  1. :使用集合,操作元素

增加元素:List.Add(Object value);

访问元素:List[索引];

• 遍历:(提示ArrayList=声明的集合变量)

//for**遍历,类似于数组

for(int i=0; i < ArrayList.Count; i++){ 类型 变量 = ArrayList[i]; cw(变量); }

//foreach**遍历 foreach(Object(类型) obj in ArrayList){ 类型 变量 = obj; cw(变量); }

删除元素:

• List.Remove(对象);//删除指定对象(没有则跳过)

• List.RemoveAt(index);//删除指定索引的对象(没有则报错)

• List.Clear();//清除集合内的所有元素

– 插入数据

• List.Insert((指定位置),数据)

案例: 发现类: 员工Employee 属性: 工号... 方法: 步骤(新)

  1. 定义员工集合

    1. 初始化员工集合

      1. 加载事件...

模糊查询 临时集合(查询) 单击事件 获取用户输入数据,循环遍历找到了,往临时集合仍,最后刷新临时集合的数据 当网格视图结果发生变化时 ,针对有增删改绑定网格视图 网格视图.DataSource = new BindingList<泛型>(临时集合);

 

当网格视图结果发生变化时 ,针对有增删改绑定网格视图 网格视图.DataSource = new BindingList<泛型>(临时集合);

1.4 Hashtable集合(不使用)

为什么要使用Hashtable:

list集合的局限性,如果找某一个员工,数据很多的情况下,如果不记得索引,使用索引不方便查 询,那就可以使用Hashtable集合,

特点:

类型不安全不推荐使用

key和value的形式存储数据,没有下标,使用key获取value,

key不能重复

foreach遍历时需要指定键或者值

1.4.1 快速入门

//**引入命名空间 using System.Collections; //**实例化对象 Hashtable nums = new Hashitable(); //**操作数据 nums.add("1",1); //**循环遍历 foreach(Object num in nums.values){ cw(num); }

增加:添加元素使用Add(key键,value值);

删除:Hashtable.Remove("key");

清空:Hashtable.Clear();

查询:Hashtable["key"];

注意:如果没有查询到就是空

是否包含(返回值bool):Hashtable.ContainsKey(key)

1.5 字典集合Dictionary

(字典)发音:带可审内瑞

特点:

类型安全

key和value的形式存储数据,没有下标,使用key获取value,

key不能重复

foreach遍历时需要指定键或者值

1.5.1 快速入门(和Hashtable使用相似)

//**实例化对象 Dictionary<String,int> nums = new Dictionary<...>(); //**操作数据 nums.add("1",1); //**循环遍历 foreach(Object num in nums.values(key)){ cw(num); }

增加:添加元素使用Add(key键,value值);

删除:Dictionary.Remove("key");

清空:Dictionary.Clear();

查询:Dictionary["key"];

注意:如果没有查询到就是空

是否包含(返回值bool):Dictionary.ContainsKey(key)

1.5.5 范例

#region 删除单击事件 private void tsbtnDelete_Click(object sender, EventArgs e) { //**判断是否选中行 if (dgvProgrammer.SelectedRows.Count == 0) { return; } DialogResult dr = MessageBox.Show("你确定要删除吗?", "提示",MessageBoxButtons.YesNo,MessageBoxIcon.Warning); if (dr == DialogResult.No) { return; } //**获取数据网格视图选中的值 int id = dgvProgrammer.SelectedRows[0].Cells["workNo"].RowIndex; //**删除 employees.RemoveAt(id); MessageBox.Show("删除成功", "提示"); //**刷新数据 BindingShow(); } #endregion;

获取当前时间Time.Now

 

1.6 总结

不管是什么集合,类型不安全一般不使用,

  • 类型安全:Dictionary,List

  • 类型不安全:Hashtable,ArrayList

list集合,

  1. 根据下标索引查数据,

  1. 可以使用for循环和foreach遍历,

  1. 操作删除单独时2种方法,根据索引删除(没有找到对象名则报错),根据对象名删除(没有找到对象名则不删除),

Dictionary集合,

  1. 根据key查询数据,

  1. foreach循环遍历需要指定获取键或者值,不能使用for循环遍历因为没有索引

  1. 操作删除只能根据对象名进行删除

  1. 查询若没有查询到数据,会报错

什么时候使用什么集合呢??

第四章深入类的方法(掌握)

1.1 构造函数

实例化对象时会隐式的调用构造函数

主要作用:为属性赋值

1.1.3 构造函数的特点:(重要)

  1. 不能有返回值,留空

  1. 构造函数名必须跟类名保持一致

  1. 构造函数可以重载不可以重复

  1. 一个类可以有多个构造函数,要区分的话就看参数的数量和参数的类型,被称为方法的重载

  1. 当一个类中没有构造参数,系统会自动分配一个无参构造

  1. 构造函数不能被直接调用,必须通过new关键字在创建对象时才会被调用

  1. 一般无参构造函数和有参构造函数一起写

1.2 构造函数快速入门

1.2.2 有参构造函数

public 类名([属性]参数...){

this.[形参]=属性; (this代表当前实例对象 在这里区分局部变量和全局变量)

}

1.2.4 无参构造函数

public 类名(){}

快速入门

1.发现类 2.发现属性 3.发现方法 4.封装构造函数,属性,方法

无参 public Student(){} 有参 public Student(int id,int age String name){ this.Id = id; this.Age = age; this.Name = name; }

1.3 方法重载

1.3.1 概念

在C#中多个方法可以共存,但是方法的参数不能一模一样,这就叫做方法的重载

符合方法重载:

• 在一个类中

• 构造函数名相同

• 参数不同(位置,数量)

1.3.5 快速入门

public void eat(){}

public void eat(int food){}

1.5 案例:

体验套餐管理系统

 发现类:
  套餐
  项目
发现属性:
  套餐:名称、价格、体检项目(字典集合)
  项目:名称、描述、价格
发现方法:
  套餐:计算价格(遍历体检项目中每个项目的价格相加)
  项目:无
封装:构造函数,属性,方法

main窗口加载事件
//体检项目集合

//初始化集合

//加载事件...

第六章 继承和多态(掌握)

继承(掌握)

继承概述

里氏替换原则,用类中共有的,替换

满足子可以替代父

语法:public class 子类:父类{}

继承的特征

单根性(只能有一个父类)

传递性(多级继承)

继承

多关注父,少关注子

能声明父,不声明子

父能待的地方,子也能待

子类继承父类

• 属性

• 方法

this和base

this 调用当前这个类

base 调用父类

继承构造参数

public 类名(参数)

:base(父类属性,父类属性)

{

子类特有的属性....

}

注意的特点

构造函数是不能被继承的:

父类中必须包含构造函数:子类的无参构造函数隐式的调用了父类的无参构造函数

案例:

1、发现类
  电池Batteryl
  交流电ACPower
  笔记本Ccmputer
2、发现属性(注册、增加、修改、查询列表)
  电池:无
  交流电:无
  笔记本:品牌Brand
3、发现方法
  电池:供电GivePower
  交流电:供电
  笔记本:显示信息ShowInfo
4、发现父、子
  父:电源
  供电
  子:电池、交流电
5、找关系
  笔记本包含电池和交流电
6、封装构造函数、属性、方法

 

多态(*)

多态入门

多态特点

对于同一个方法,不同的对象会产生不同的结果

让对象智能化的直到自己该做什么

多态的应用

父类作为一个类的属性

父类作为一个类方法的参数

方法的重写和重载(掌握)

方法的重载

在同一个类中,方法名相同,参数不同

方法的重写

在父子类中实现,方法名相同,参数相同,返回值相同

override 在修饰符 返回值的中间增加

抽象类(掌握)

  1. 抽象方法和虚方法的区别:

虚方法有方法体

抽象方法没有方法体

  1. 创建抽象类在修饰符后面加:abstract

  1. 可以包含普通方法,虚方法,抽象方法

  1. 列举一个类的行为,没有具体的实现方式

  1. 抽象类不能被new

  1. 抽象类不能是密封类,或静态的(了解)

抽象方法(掌握)

  1. 修饰符后面写abstract**就是抽象方法**

  1. 什么时候需要抽象方法?

当方法没有具体的实现方式(不需要方法体的时候)

  1. 定义抽象方法之前,类也必须是抽象类

  1. 只提供行为,不提供具体的实现方式,具体的实现方式交给子类去做

  1. 抽象方法必须被子类重写,除非子类也是抽象的

虚方法

必须有方法体

可以不被重写

案例:

饲养员小李喂动物 猴子吃香蕉 狗狗吃骨头 兔子吃萝卜

发现类:饲养员,猴子,狗,兔子 属性: 饲养员:姓名 猴子:无 狗:无 兔子:无 行为: 饲养员:喂食物 猴子:吃 狗:吃 兔子:吃 继承关系 父类:动物 子类:猴子,狗,兔子 关系:无 ...

第八章XML

概述

跨平台,数据交互,跨操作系统,又被称为轻量级的数据库

可扩展性标记语言,xml用于描述数据

注释

<!- -->

快速入门

C#-->创建项目>数据>xml

== 头文件 描述版本信息和字符集(不能删)

特点

• 注意:xml严重区分大小写

• 根级别标签,只能由一个,子节点是可以重复的

自定义标签

<student>
  <name>张三</name>
  <age>25</get>

  <name>李四</name>
  <age>25</get>
</student>

注意:xml注释,使用时会被解析,为空行

解析xml步骤

将xml路径放到debug根目录:右上角显示全部文件-->CTRL+x,剪切粘贴

*//**引入命名空间*
using System.Xml;
*//**创建XmlDocument**对象*
XmlDocument doc = new XmlDocument();
*//**将文件加载*
dos.Load("相对路径/或绝对路径");
*//**获取根节点*
XmlNode root = doc.documentElement;*//**这里有个继承关系* *先声明父不声明子,**左父,**右子*
*//**根据需求进行解析 foreach**遍历*
foreach(XmlNode childRoot in root.ChidNodes){
  cw(childRoot.IndexXml):
}

根节点下的子节点下的获取数据

//...*
*//**根据需求解析*
foreach(XmlNode node in root.ChildNodes){
  String name = node["name"].InnerXMl;
  String age = node["age"].InndexXml;
  ...
}

foreach (XmlNode childRoot in root.ChildNodes)
{
  String name = childRoot["name"].InnerXml;
  String age = childRoot["age"].InnerXml;
  String gender = childRoot["gender"].InnerXml;
  *//**判断*
  Console.Write("姓名是:{0},", name);
  Console.Write("年龄是:{0},", age);
  Console.WriteLine("性别是:{0},", gender);
}

*//**根据需求解析*
foreach(XmlNode node in root.LastChild.ChildNode){*//**最后一个子节点的子节点*

}
String myShoolName = root.FirstChild.InnerXml;

案例:

img

 

数字有效性判断

int.TryParse(num1, out newNum1); 将某个数据转型到某个地方 (返回值bool类型 转型成功true失败false)

第九章文件流

概述讲义

为什么要使用io流?

关于文件的读写,复制删除修改,

使用有什么好处?

有些数据可以替代数据库的使用,可以不依赖数据库,读写数据

缺点: 不舍和

使用前要注意几点?

操作文件路径的时候,\转义符需要屏蔽 ,@或\

写=set,读=get

枚举类

类和类名之间加enum

a = 1, b =2,c =3

 

快速入门

\1. 引入命名空间: using System.IO;

\2. 创建文件流: FileStream myfs = new FileStream(String path文件路径,FileMode FileMode.指定如何打开文件);

– FileMode枚举

• Create:创建一个新文件。如果文件存在,则改写旧文件

• Open :指定打开现有文件。指定的文件必须存在,否则出现异常

• CreateNew:新建一个文件。如果文件存在发生异常,提示文件已经存在

• Append:打开现有文件追加

\3. 创建写入器和读取器StreamWriter,StreamReader

– 文本文件写入器

• StreamWriter mySw = new StreamWriter(myfs传入文件流);

– MySw.Write(content); //写入方法

– MySw.WriteLine(content); //写入一行数据的方法

– 文本文件读取器

• StreamReader mySr = new StreamReader(myfs);//这里给一个文件写入器

– content = mySr.ReadToEnd(); //读取文件到末尾

– content = mySr.ReadLine(); //读取一行

\4. 数据操作

– read.ReadToEnd(); //读取全部 包括空格

– 循环读取

• while (){}

– 写入

\5. 释放资源

– mySw.Close();

– mySr.Close();

– 提示:如果用了多个流或者读取器,关闭他们的周期是:被创建的顺序相反即可.

范例:

文件写入内容:

*//**创建文件流*
FileStream stream = new FileStream("A:\\a.txt", FileMode.Append);
*//**创建写入器*
StreamWriter writer = new StreamWriter(stream, Encoding.Default);
*//**执行操作*
Console.Write("请输入录入信息:");
String str = Console.ReadLine();
*//**写入文件*
writer.WriteLine(str);
Console.WriteLine("录入成功");

*//**关闭写入流*
writer.Close();
*//**关闭文件流*
      stream.Close();

文件读取内容:

String path = "A:\\a.txt";
*//**文件流*
FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
*//**文件读写器*
StreamReader read = new StreamReader(stream, Encoding.UTF8);
*//**执行操作读取全部*
String content = read.ReadToEnd();
Console.WriteLine(content);
*//**关闭流*
read.Close();
stream.Close();

 

解决乱码问题

在读取器的第二个参数,即可设置编码Encoding.UTF-8

文件操作常用方法等

方法说明
bool Exists**(string path)** 用于检查指定文件是否存在,该方法返回一个布尔值
void Copy(string sourceFileName string destFileName) 将指定路径的源文件中的内容复制到目标文件中,如果目标文件不存在,则在指定路径中新建一个文件
void Move (string sourceFileName, string destFileName) 将指定文件移动到一个新的路径
void Delete**(string** path) 删除指定的文件**,如果指定的文件不存在,则不引发异常**

实例:

//判断文件是否存在
String path = ..;
bool result = File.Exists(path);

//复制文件
File.Copy(原路径,目标路径); //2个参数都是String类型

//剪切文件
File.Move(原路径,目标路径);

//删除文件
File.Delete("删除路径");

目录操作

方法说明
bool Exists**(string path)** 用于检查指定文件夹在磁盘上是否存在
void Move (string sourceDirName, string** destDirName) 用于**将文件或目录及其内容移到新位置**
void Delete**(string path,** bool recursive) 删除指定目录,如果**bool指定true,则删除子目录中的所有目录内容**
void Delete**(string path)** 从指定路径删除空目录

范例:

 //移动
 Directory.Move(path, "A://b");
 Console.WriteLine("移动成功");

//删除
Directory.Delete(path);//删除空目录
Console.WriteLine("删除成功");

Directory.Delete(path, true);//删除整个目录文件
Console.WriteLine("删除成功");

静态与非静态

静态类是什么,为什么要用它?

使用前要注意什么?

静态的 需要使用类调用

静态类和非静态类

public static class Directorypublic static class File

静态类非静态类
static修饰 不用static修饰
只包含**静态成员** 可以包含静态成员
不可以包含实例成员 可以包含实例成员
使用类名调用静态成员 使用实例对象调用非静态成员
不能被实例化 可以被实例化
不能包含实例构造函数 包含实例构造函数

静态成员和非静态成员

public static 变量类型 变量名;

public static 返回值 方法名(参数){}

需要注意的点: 静态成员为一个类的所有实体所共享,它属于类,而不属于类的某个对象!

 

静态成员使用类名调用:

\1. 类名.方法名(); // 调方法

\1. 类名.变量名 = ...; //给字段(属性)赋值

静态成员和实例成员

使用static修饰的成员称为静态成员

使用实例对象调用的成员称为实例成员

 

静态方法实例方法
static**关键字** 不需要**static关键字**
使用类名调用 使用实例对象调用
可以访问静态成员 可以访问静态成员
不可以直接访问实例成员 可以直接访问实例成员
调用前初始化 实例化对象时初始化

FileInfo类文件(非静态)

属性方法说明
Exists 用于检查指定文件是否存在,返回一个布尔值
Extension 获取表示文件扩展名部分的字符串
Name 获取文件名
FullName 获取目录或文件的完整目录
FileInfo CopyTo(string) 将现有文件复制到新文件,不允许覆盖现有文件
void Delete() 永久删除文件
void MoveTo(string) 将指定文件移到新位置

范例:

//创建文件类对象
FileInfo file = new FileInfo("FileName文件路径");

//判断文件是否存在
if(file.Exists){}

//获取扩展名
fileanme = file.Extension;
//获取文件类型
filename.trim(".");
//获取文件名称
file.name;

//获取文件的路径
file..FullName;

//复制
file.copyTo("新路径");
//移动
file.moveTo("新路径");
//删除
file.deleteTo("新路径");

应用场景:

由于File类的静态方法在使用时都会进行安全检查,所以如果想要多次使用某个文件对象,可以考虑使用FileInfo类相应的实例方法,因为并不总是需要安全检查

DirectoryInfo操作目录(非静态)

image-20200717111208566

案例

//路径
//DirectoryInfo非静态操作目录
Dire... directory = new ...("路径");
//获取目录后的目录
DirectoryInfo[] dirs = directory.GetDirectories();
//获取目录后的文件
FileInfo[] files = directory.GetFiles();

//循环获取目录名称等
foreach(DirecoryInfo dir in dirs){
	cw(dir.name)//循环获取文件姓名
	cw(dir.)
}
//循环获取文件名称等
foreach(FileInfo file in files){
	cw(finle.FullName);//路径
	cw(file.Length)//文件大小
}



posted @ 2020-07-31 10:04  最终丶尽头  阅读(226)  评论(0)    收藏  举报