文件操作—整理
IO操作
复习集合:
ArrayList al=new ArrayList(); 1.长度可变,里面真正存储数据的是一个object数组(0个长度),2.第一次添加数据时,object数组被初始化为4个长度的数组对象 3.容量已满时,那么进行扩容, 数组长度*2
Object[] obj=new object[4]; 固定长度
Hashtable ht=new Hashtable();
----------------------------IO及序列化----------------------------
1.窗体有3个文件组成 (Form1.cs ,Form1.Designer.cs Form1.resx )
a) Form1.cs 凡是继承于 Form类的都可以看成是窗体
b) Form1.Designer.cs 由partial关键字修饰的类 ,用它可以将放在不同地方, 这个文件中 有窗体初始化代码(添加控件,,设置窗体控件大小,位置等)
c) Form1.resx 资源文件,可以将图片,文件打包到 .resx文件中,不容易被他人修改其中内容.
2..windows窗体
partial关键字 分布类,用它可以将类放在不同地方
窗体上拖入的控件,其实都是窗体类的成员.(Controls)
当我们点击按钮的时候,(通过事件对象绑定click方法 EventHandler Click)调用了按钮对象的OnClick()方法,再找到用户双击按钮生成的Button_Click()方法
3.文件操作IO: 常用相关类 目录和文件的命名空间System.IO
a) File类----操作文件,对文件整体操作.拷贝,删除,剪切等
b) Directory----操作目录(文件夹),静态类
c) Path-----对文件或目录的路径进行操作(很方便) --针对地址字符串
d) DirectoryInfo----文件夹的一个"类",用来描述一个文件夹对象
e) FileInfo----文件类,用来描述一个文件对象
f) Stream---文件流,抽象类
i. FlieStream-->文件流, MemoryStream(内存流),NetworkStream
(网络流)
ii.StreamReader-->快速读取文本文件
iii.StreamWrite-->快速写入文本文件
5.当我们使用文件流的时候,在关闭流的时候,数据才会保存到文件中,
因为在写文件的时候,内容先写在文件流的缓冲区中byte[] buffer, 等程序关闭后,内容才能写入.
Winform中 的Close()方法中自动调用Dispose(),然后调用GC回收
Using的本质就是一个 try finally 语句块, finally代码块中调用IDisposable接口中 Dispose();
所有要使用using关键字 来释放资源的类,都必须实现IDisposable接口,如果想在using中捕捉异常的话,还需要用try catch
1.Path类:
i. string ChangeExtension("1.jpg",".exe");修改后缀名, 注意:转换文件后缀名,并不会直接修改文件,而是返回一个修改后的新路径名 字符串. string s = Path.ChangeExtension(@"C:\temp\F3.png", "jpg")
ii. String Combine(string path1,string path2);拼接字符串,形成新的文件路径,可以方便的解决不加"\"的问题,自动处理分隔符问题
iii. String GetdirectoryName(""); 取得文件所在文件夹 对应的 路径名.(即 除文件名之外的路径)
iv. String GetExtension(string path);获得文件 后缀名.
v. String GetFileName(string path);获得文件名
vi. String GetNameWithOutExtension(); 获得不带后缀的 文件名
vii. String GetFullPath(); 获得相对路径对应的 绝对路径 (注意:此时返回的绝对路径是程序集 的路径+传入的相对路径)
viii. String GetTempPath() ;获得临时文件夹路径
ix. String GetTempFileName();获得生成的 一个临时文件夹下的文件路径.
对象序列化: 就是将对象里的字段及值 以"文本"的方式保存成文件
反序列化: 先创建一个相同的对象,然后将"文本"里保存的字段值 一 一设置到对象对应的字段值中.(过程: 读取文件中的类型和字段信息,通过反射创建类型对象)
序列化里的类 BinaryFormatter bf= new BinaryFormatter();
bf.Serilalize();//该方法内部进行反射创建类型对象
文件操作常用相关类
File //操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。
Directory //操作目录(文件夹),静态类。
DirectoryInfo //文件夹的一个“类”,用来描述一个文件夹对象
FileInfo//文件类,用来描述一个文件对象
Path//对文件或目录的路径进行操作(很方便)【字符串】
Stream//文件流,抽象类。
FileStream//文件流,MemoryStream(内存流),NetworkStream(网络流)
StreamReader //快速读取文本文件
StreamWriter//快速写入文本文件
操作目录:
为了实现目录树,所以要掌握读取目录的类
Directory和DirectoryInfo
1.void Delete(string path, bool recursive------删除目录, recursive表示是否递归删除,如果recursive为false则只能删除空的目录,如果为true的话,连带该目录下的子目录一起删除
2.bool Exists(string path) -------判断目录是否存在
3.move(string path1,string path2)------文件移动,从path1移动到path2
4,CreateDirectory(string path)------创建新的文件夹(指定要创建文件夹的路径)
5.string[] GetDirectories(string path)-------得到一个目录下的子目录
6.String[] GetDirectories(string path, string searchPattern, SearchOption searchOption)------通配符查找目录下的子目录,可以搜索到隐藏文件。
7.static string[] GetFiles(string path)------得到一个目录下的文件
8.String[] GetFiles(string path, string searchPattern, SearchOption searchOption)-------根据通配符查找目录下的文件(参数:搜索文件夹的路径, 通配符,是否搜索所有的子文件)
9.DirectoryInfo GetParent(string path)-----得到目录的父目录
10.获取当前exe文件执行的路径:
Assembly.GetExecutingAssembly().Location;
不要用下面这个:
AppDomain.CurrentDomain.BaseDirectory;获得运行环境中的程序集中 当前运行的程序集 的根目录
11.Directory.GetCurrentDirectory();获取应用程序的当前工作目录。因为这个可能会变,通过使用OpenFileDialog或者手动设置Directory.SetCurrentDirectory()
操作文件
1.文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding("GBK")
输出Encoding.GetEncodings(),所有编码。
2.什么是文本文件。拖到记事本中还能看得懂的就是文本文件,doc不是。
3.File类的常用静态方法:(FileInfo*)
void AppendAllText(string path, string contents),将文本contents附加到文件path中(如果文件不存在,则创建)
bool Exists(string path)判断文件path是否存在
string[] ReadAllLines(string path) 读取文本文件到字符串数组中
string ReadAllText(string path) 读取文本文件到字符串中
void WriteAllText(string path, string contents)将文本contents保存到文件path中,会覆盖旧内容。
WriteAllLines(string path,string[] contents),将字符串数组逐行保存到文件path中,会覆盖旧内容。
4. File类的方法2:操作文本文件
1.File.ReadAllLines(“path”, Encoding.Default);//读取所有行,返回string[]
File.ReadAllText(“path”, Encoding.Default);//读取所有文本返回string
File.ReadAllBytes(“path”);//读取文件,返回byte[]
===================================
File.WriteAllLines(“path”, new string[4] ,Encoding.Default);//将string数组按行写入文件。
File.WriteAllText(“path”, “string”);------将字符串全部写入文件
File.WriteAllBytes(“path”,new byte[5]);------将byte[]全部写入到文件
File.AppendAllText();-----将string追加到文件
File.Copy(“source”, “targetFileName”, true);-----文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。
File.Exists();------判断文件是否存在
File.Move(“source”, “target”);------移动(剪切),思考如何为文件重命名?
File.Delete(“path”);------删除。如果文件不存在?不存在,不报错
File.Create(“path”);-------创建文件
小项目:资料管理器:
1.通过控件treeview显示两级目录
2.动态添加treeview节点。di.GetDirectories()获取所有的根文件夹
TreeNode tn = new TreeNode();
tn.Text = d.Name;
tn.Tag = d.FullName;
treeView1.Nodes.Add(tn);
3.遍历根文件夹的同时添加二级节点,三级节点上添加文件的名儿
4.双击文本节点(怎么判断是否是文本节点?)在文本框中显示资料的内容
递归的方式 显示无限极节点
文件操作学习要点:
1.IO类的静态方法,方便程序员能快速操作文件夹和文件
a) File
b) DIrectory
c) Path
2.(重点)文件流:
a) FileStream fs=new FileStream("路径",FileMode.OPenOrCreate)
b) StreamReader sr=new StreamReader (fs,Encoding.Default);
1. String str=sr.Readline();
c) StreamWriter sw=new StreamWriter(fs,Encoding.Default);
1. sw.writeLine("aaaa");
FileStream 主要用来操作任意类型格式的文件数据
StreamReader ,StreamWriter 是直接操作字符串的文本格式 将流中缓冲区保存的数组 转到 StreamReader 中的缓冲区字符数组中.
1.序列化:
[Serializable] //可能被序列化的对象的类,必须加入(可序列化) 特性
Public class Person{}
二进制格式化器,将对象(字段和字段值, 类名)转成文本.
2.反序列化:
二进制格式化器,按照文本(字段和字段值,类名)信息里的类名,使用反射技术 创建 对象,并将对应的字段值设置到新对象的字段中.
3.序列化 和 反序列化 的真实应用怎么的?
a) 传输对象
b) 持久化保存对象(硬盘)