保存程序中的数据或者程序计算的结果(这个过程有时也被称为数据持久化)我们可以考虑采取以下两种方式:数据库和文件。通常数据库适用于大批量的包含复杂查询的数据维护。对于简单的数据,用数据库进行存储操作复杂而且成本较高。而文件适用于相对简单的数据保存,如很多程序的用户配置信息都会保存在文件中。
如何读写文件
通常来讲,用C#程序读写一个文件需要以下5个基本步骤。
1.创建文件流
2.创建阅读器或者写入器
3.执行读写操作
4.关闭阅读器或者写入器
5.关闭文件流
这里需要在类中引入System.IO命名空间。
using System.IO;
这个命名空间用于对文件和文件流的处理。
文件流
FileStream类主要用于读写文件中的数据,在创建一个文件流时,需要在它的构造函数中指定参数。
语法:
FileStream 文件流对象=new FileStream(String filePath,fileMode);
其中:
Create:用指定的名称创建一个文件,。如果文件存在,则改写就文件。
CreateNew:新建一个文件。如果文件存在会发生异常,提示文件以及存在。
Open:打开一个文件。使用这个枚举值时,指定文件必须存在,否则发生异常。
OpenOrCreate:OpenOrCreate与Open成员类似,只是如果文件不存在,则用指定的名称新建一个文件并打开它。
Append:打开现有文件,并在文件末追加内容。
关闭文件流
写入结束后一定要关闭文件流 文件流对象.Colse();
文件读写器
StreamWriter写入器
创建文件流之后,我们要创建读取器或者写入器,StreamWriter类称为写入器,用于将数据写入文件流,只要讲创建好的文件流传入,就可以创建它的实例,例如:
StreamWriter Sw=new StreamWriter(Fs);
创建好写入器后,可以调用它的方法将要写入的内容写入文件流,其中的主要方法如下。
StreamWriter.Writer():用于写入流,这个例会就是我们创建好的流。
StreamWriter.WriteLine():用于写入一行数据,写入某些数据后跟换行符。
StreamWriter.Close():用于关闭写入器。
需要注意的是,当写入器使用完毕,关闭写入器的方法是必须调用的,否则会出现要写的内容无法写入文件的情况。
如果一个程序用来多个、写入器,它们的关闭顺序一般要和自身在程序总被创建的顺序相反。
StreamReader读取器
StreamReader主要用于读取流中的数据,它主要包含以下几种方法。
StreamReader.ReadLine():读取文件流中的一行数据,病返回字符串。
StreamReader.ReadToEnd():从当前位置读到末尾,返回字符串。
StreamReader.Close():用于关闭读取器。
解决乱码问题
Encoding类位于System.Text命名空间,用来表示字符编码。
1.可以通过Encoding类的静态成员指定编码格式。例如:
Encoding.UTF8:获取UTF-8格式的编码。
Encoding.Default:获取操作系统的当前编码。
2.也可以通过Encoding类的静态方法GetEncoding(String name)指定字符编码,参数name必须是C#支持的编码。例如:
StreamReader Sr=new StreamReader(Fs.Encoding.GetEncoding("GB2312"));
文件和目录操作
File类和Directory类
返回值类型 | 方法名称 | 说明 |
bool | Exists(string path) | 用于检查指定文件是否存在 |
void | Copy(string sourceFilePath,string destinationFilePath) | 将指定路径的源文件中的内容复制到目标文件中,如果目标文件不存在,则在指定路径中新建一个文件 |
void | Move(string sourceFileName,string desFileName) | 将指定文件移到一个新的路径 |
void | Delete(string Path) | 删除指定的文件,如果指定的文件不存在,则不引发一场 |
需要注意的是,File类的Exists()方法在进行文件操作时常常用到。很明显,如果不事先判断文件是否存在,那么对于文件的复制,移动,删除等操作都有可能失败。
静态类和静态方法
File类和Directory类在使用它们的方法时都不需要实例化,二十直接使用类名.方法()的方式调用。这其实和是静态方法的调用方式,静态方法需要用类名来访问,同事使用static关键字修饰,现在我们要介绍一个新的概念:静态类。静态类只含有静态方法,不能使用NEW关键字创建静态类的实例。
用static修饰 | 不用static修饰 |
只包含静态成员 | 可以包含静态成员 |
不可以包含实例成员 | 可以包含实例成员 |
使用类名调用静态成员 | 使用实例对象调用非静态成员 |
不能被实例化 | 可以被实例化 |
不能包含实例构造函数 | 包含实例构造函数 |
语法:
class 类名 { public static 数据类型 变量名; public static 返回值 方法名(参数列表) { //方法体 } }
提供实例方法的文件和目录操作
FileInfo类和File类的功能类似,都可以完成对文件的复制,移动,删除等操作。不同的是,使用FileInfo类必须实例化对象。
同样,DirectoryInfo类和Directory类的功能类似,都可以完成对目录的复制,移动,删除等操作。但是使用DirectoryInfo类必须实例化对象。
读取目录下的子目录信息
操作目录可以使用Directory类和DirectoryInfo类。由于资源管理器中的目录需要多次使用,所以优先选择DirectoryInfo类。