单词
file 文件
directory 目录
stream 流
encoding 编码
exist 存在
文件概述
我们知道,程序中的数据通常保存在内存中,当程序关闭后,这些内存中的数据就会被释放。如果想保存程序的数据或者程序计算的结果(这个过程有时被称为数据持久化),我们可以采取以下两种方式:数据库和文件。通常数据库适用于大批量的包含复杂的查询,和数据的维护,而简单的数据,用数据苦存储,成本较高,而文件适合于相对简单的数据保存。
读写文件的步骤
- 创建文件流
- 创建阅读器或者写入器
- 执行读写操作
- 关闭阅读器或者写入器
- 关闭文件流
(1)文件流
- 读写文件的第一步创建文件流,流是用于数据传输的对象,写入结束后一定关闭文件流。
- 引入 System.IO命名空间用于对文件和文件流的处理,提供文件操作的类。文件流(FileStream类)用于读写文件中的数据,在创建文件流时,需要在他的构造函数中指定参数。
语法
FileStream myfs = new FileStream( string path, FileMode mode );
string path:指定文件路径
FileMode mode :指定如何打开文件,枚举类型,常用成员如下。
- Create:创建一个新文件。如果文件存在,则改写旧文件
- CreateNew:新建一个文件。如果文件存在会发生异常,提示文件已经存在
- Open:指定打开现有文件。指定的文件必须存在,否则会发生异常
- OpenOrCreate: OpenOrCreate和Open类似,吐过文件不存在,用指定的名称新建一个文件并打开他。
- Append:打开现有文件夹,并在文件末尾追加内容。、
常见错误
- 无法识别转义序列
- 第一种方法:把路径中的"“换为”\"。
- 第二种方法:在路径前面加上"@"。
string path ="D:\\Text.txt";
string path =@"D:\Text.txt";
文件读写器
-
StreamWriter写入器
- 创建文件流之后,我们要创建 读取器 或 写入器,StreamWriter类称为写入器,用于将数据写入文件流,只要将创建好的文件流传入,就可以创建他的。
StreamWriter mySw = new StreamWriter(myfs); ----传入文件流
- 创建好写入器之后,调用他方法,将要写入的内容写文件流。
mySw.Write(content);------写入方法
mySw.WriteLine(content);---------写入一行数据的方法
mySw.Close();-----关闭写入器- 当写入使用完毕后,关闭写入器的方法是必须调用的。否则会出现 要写入的内容无法写入文件 的情况。
- 如果一个程序用了多个流、读写器,它们的关闭顺序一般要和自身在程序中被创建的顺序相反
-
StreamReade读取器
- StreamReade主要用于读取流中的数据
StreamReader mySr = new StreamReader(myfs);------传入文件流
content = mySr.ReadToEnd(); -----读取文件到末尾
content = mySr.ReadLine();-------读取一行
乱码问题
FileStream myfs = new FileStream(path, FileMode.Open);
//读取器
StreamReader mySr = new StreamReader(myfs, Encoding.Default);
content = mySr.ReadToEnd();
txtContent.Text = content;
- Encoding类指定字符编码。Encodeing类位于System.Text命名空间,用来表示字符编码。
- 可以通过Encodeing类的静态成员指定编码格式。
Encoding.UTF8:获取UTF-8格式的编码
Encoding.Default:获取当前操作系统的字符编码
Encoding.GetEncoding(“XXX”):参数必须是C#支持的编码。
文件和目录操作
File类和Directory类
前面学习如何读写文件,实际文件操作可以移动,删除等。
.NET中框架类库向用户提供了一个File类,位于System.IO命名空间,提供了很多方法用于文件操作,常用方法如下:
注意:File类的Exists()方法,在进行文件操作时常常用到。很明显,如果不实现判断文件是否存在,在操作的时候很有可能失败
提到文件(File)的操作,就不能不提如何操作目录(文件夹),操作目录的是Directory类。
静态类和静方法
- File类和Directory类在使用他们的方法时,不需要实例化,而是直接使用类名. 方法名();的方式调用。这其实是静态方法的调用方式。
- 静态方法的调用方式,需要用类名访问,同时使用static关键字来修饰。
- 静态类中只能包含静态方法,不能使用new关键字创建静态类的实例。|
静态和非静态的区别
语法:
class 类名
{
public static 数据类型 变量名;
public static 返回值类型 方法名(参数列表)
{
//方法体
}
{
在 语法中展示两种形式,静态成员变量和静态成员方法,即类中的变量和方法都可以声明为静态的。静态成员是一种特殊的成员,他不属于类的某一个具体实例。
类的静态成员在第一次访问前被初始化,系统在内存中分配一块区域存储他,之后一直存在,一直到程序退出才会释放。
静态成员的使用
-
调用静态成员
类名.变量名 = XX; //给变量赋值
类名.方法名(); //调用静态方 -
应用场合:
当类不会有多个对象而更像是一个公用类的时候,
或当方法或属性是“公用”信息的时候声明为静态的比较好!
提供实例方法的文件和目录操作
- 前面讲的File类和Directory类都用静态方法和目录
FileInfo类属性和方法
应用场景:
由于File类的静态方法在使用时都会进行安全检查,所以如果想要多次使用某个文件对象,可以考虑使用FileInfo类相应的实例方法,因为并不总是需要安全检查
DirectoryInfo属性和方法
示例:
示例中使用了DirectoryInfo类的重要方法
- GetDirectories():该放法返回当前目录的子目录对象数组。Directory类也有这个方法。但返回值是当前目录子目录的名称数组。
- GetFiles():该方法返回当前目录下文件列表(FileInfo对象数组)。Directory类也有这个方法,但返回值是返回指定目录下的文件名数组。
应用场景:如果需要对当前目录下的子目录和文件进行一步操作,显然用DirectoryInfo类比较方便。如果只想知道当前目录下的子目录和文件的名称可以选用Directory类。
问答
既然File类,FileInfo类都能操作文件,同样用Directory类和DirectoryInfo类都能操作目录,使用如何取舍?
答:由于File类的静态方法在使用时都会进行安全检查,如果想要多次使用某个文件对象,可以考虑使用FileInfo类相应的实方法,应为并不总是需要安全检查。
读目录下的文件信息
MyFile类来存储文件信息,以下属性