C#IO流文件操作
文件概述
我们知道,程序中的数据通常保存在内存中,当程序关闭时其对应的内存空间就会被释放掉,也就是说我们在程序中所作的操作或对数据的更改会在程序结束时自动删除,没办法永久的保存,如果你想永久的保存这些数据,则可以考虑使用数据库或文件对这些数据在磁盘上进行存储,数据库适合存储比较庞大的数据量当数据比较简单时使用数据库存储操作复杂,且成本较高。而文件则适合对简单数据进行存储。比如很多程序的用户配置信息都保存在文件中!
如何对写文件
通常来讲,用C#程序对鞋一个文件需要以下5个步骤
- 创建一个文件流
- 创建阅读器或写入器
- 执行读写操作
- 关闭阅读器或写入器
- 关闭文件流
注意:在对文件进行操作之前需要引入IO命名空间
using System.IO;
这个命名空间用于对文件和文件流的处理
文件流
创建文件流
读写文件的第一步就是创建文件流,流是一个用于数据传输的个对象,它是FileStream类型,在创建一个文件流是需要在他的构造中指定参数
语法:
FileStream 文件流对象=new FileStream( String filePath,FileMode fileMode);
其中filePath用于指定要操作的文件,fileMode用于指定文件的打开方式,它是一个枚举类型,
fileMode的常用成员如下:
- Create:用指定的名称新建一个文件,如果文件已存在则覆盖原有的文件
- CreateNew:新建一个文件,如果文件已存在会报异常提示文件已存在
- Open:打开一个文件,使用这个枚举是文件必须已存在,否则会报异常
- OpenOrCreate:与Open成员类似,如果文件不存在则用指定的名称新建一个文件并打开它
- Appen:打开现有文件,并在末尾追加新的内容。
小提示:“\”在C#中表示转译,所以我们在写文件路径是不能直接以这样的形式写(“D:\files”),我们可以在“”号的前面加一个@符号来取消转译,也可以用”\\”来代替“\”
文件读写器
创建文件流之后,我们要创建读取器或者写入器,StreamWrite被称为写入器只要将创建好的文件流传入就可以创建它的实例
StreamWriter sw=New StreamWriter(文件流对象);
创建好写入器之后我们就可以调用他的方法向文件类文件流,其主要方法如下:
- StreamWriter.Write():用于写入流,这个流是我们创建好的流
- StreamWriter.WriteLine():用于写入一行数据,写入某些数据后跟换行符
- StreamWriter.Close():用于关闭写入器
注意:当写入器使用完毕后一定要调用Close()方法关闭写入器,否则会发生要写的内容无法写入文件的情况。
StreamReader读取器
StreamReader主要用于读取流中的数据,它主要包含以下方法:
- StreamReader.ReadLIne():读取文件流中的一行数据,并返回字符串
- StreamReader.ReadToEnd():从当前位置读到末尾,返回字符串
- StreamReader.Close();用于关闭读取器。
解决乱码问题
用StreamReader读取文件中的中文文本,有事会出现乱码问题。这并不是C#语言的问题,有可能是因为编码格式的问题。在读取文件是指定对应的编码格式已解决乱码问题。
如:StreamReader myfil=new StreamReader(文件流对象,Encoding.Default);
Encoding的静态成员指定编码格式。如:
- Default表示获取操作系统当前的编码格式
- UTF-8表示获取UTF-8格式的编码
文件和目录操作
File和Directory类
File类的常用方法
返回值类型 | 方法名称 | 说明 |
bool | Exists(string path) | 用于检查指定文件是否存在 |
void | Copy(string sourceFilePath,string destinationFilePath) | 将指定路径的原文件中的内容复制到目标文件中,如果目标文件不存在,则在指定路径中新建一个文件 |
void | Move(string sourceFilePath,string destFileName) | 将制定问价移动到一个新的路径 |
void | Delete(string path) | 删除指定的文件,如果指定的文件不存在,则不引发异常 |
File类对文件进行操作而Directory类对目录进行操作(文件夹)
Directory类的常用方法
返回值类型 | 方法名称 | 说明 |
bool | Exists(string path) | 用于检查指定文件夹在磁盘上是否存在 |
void | Move(string sourceDirName,string destDirName) | 用于将文件或目录文件及其内容移到新位置 |
void | Delete(string path,bool recursive) | 删除指定目录,如果recursive值为true,则删除子目录中的所有目录内容 |
静态类和静态方法
静态类只含有静态方法,不能使用new关键字创建静态类的实例。
静态类与非静态类的区别
静态类 非静态类 用static修饰 不用static修饰 只包含静态成员 可以包含静态成员 不可以包含实例成员 可以包含实例成员 使用类名调用静态成员 使用实例对象调用非静态成员 不能被实例化 可以被实例化 不能包含实例构造函数 包含实例构造函数
提供实例方法的文件和目录操作
前面的File类和Directory类都用静态方法操作文件和目录,其实.NET框架提供了用实例方法操作文件和目录的类
FileInfo、DirectoryInfo和File、Directory类似都可以完成同样的对文件或目录的操作,但是FileInfo和DirectoryInfo类必须实例化对象,使用对象调用方法!