文件的操作
一、读取文件
在文件这里推荐三个控件:OpenFileDialog:选择打开文件、saveFileDialog:选择保存文件、FolderBrowserDialog:获取目录;
1、读写文件的步骤
在文件操作之前要导入命名空间:System.IO;
读写文件的步骤分为5步:
1、创建文件流
语法:
FileStream fd = new FileStream("文件路径",FileMode);
//其中“FileMode”是枚举类型的,枚举类型的主要作用是约定一个变量的值的范围;其中包括有:
Create:用指定名称新建一个文件,如果文件存在就改写旧文件;
CreateNem:新建一个文件;
Open:打开一个文件;
OpenOrCreate:打开一个文件,如果文件不存在就用指定的名称新建一个文件;
Append:打开现有的文件,并在文件的末尾追加内容;
Truncate:文件存在,先把里面的内容删除掉,再往里面写内容,如果文件不存在就会报错。
2、创建阅读器\写入器
1、创建阅读器:StreamReader
创建:
StreamReader sr = new StreamReader(FileStream fs);
属性:
sr.ReadLine(); 读取文件流中一行数据;
sr.ReadToEnd(); 从当前位置读到末尾,返回字符串;
sr.Close(); 关闭
2、创建写入器:StreamWriter
创建:
StreamWriter sw = new StreamWriter(FileStream fs);
属性:
sw.Write(); 用于写入流,该流是已创建好的流;
sw.WriteLine(); 用于写入一行数据,后跟换行符;
sw.Close(); 关闭
3、执行读写操作
这里只需要写你需要的代码
4、关闭阅读器\写入器
关闭阅读器:sr.Close();
关闭写入器:sw.Close();
5、关闭文件流
关闭文件流:fs.Close();
注:这里的关闭顺序不能错,否则会报错,关闭顺序必须是先关阅读器\写入器,再关文件流。
2、文件流
流:是一个用于数据传输的对象;
文件流:C#里面指的文件流是FileStream,主要用于读写文件中的数据;
3、解决乱码问题
用StreamReader读取文件中的文本文件的时候,可能会出现乱码的问题;要解决这个问题就要指定编码格式;
StreamReader sr = new StreamReader(FileStream fs,Encoding.Default);
这里的Encoding类就是指定编码格式;Encoding位于System.Text命名空间;
Encoding.UTF8: 获得UTF-8格式的编码;
Encoding.Default: 获得当前操作系统的当前编码;
也可以通过Encoding类的静态方法GetEncoding(string name)指定字符编码,参数name必须是C#支持的编码名;
StreamReader sr = new StreamReader(FileStream fs,Encoding.GetEncoding("GB2312"));
这就是Encoding的方法GetEncoding(string name)的使用;
常见的编码名:ASCII、ANSI、GB2312、Unicode(UTF-16、UTF-32、UTF-8),C#内部默认支持UTF-8编码;
二、操作文件和目录
1、文件
文件有两个类:File(是静态类)和 FileInfo(非静态类)
1、File的方法:
static void Delete(string path) 删除文件
static void bool Exists(string path) 检查指定文件是否存在
static void Copy(string soureFilePath,string destFilePath) 复制文件
static void Move(string soureFileName,string destFileName) 移动文件
static FileStream Create(string path) 新建文件
注:path:路径、soureFilePath :原文件路径、destFileName :新文件路径、
这些都是比较常用的方法,想知道更多方法可以去查看源码;查看源码的方法有两种:1、按ctrl+单击;2、在File类上右击选择“转到代码定义处”;
移动和复制的区别:复制原文件还存在;
2、FileInfo:禁止继承
构造函数:FileInfo只有一个构造函数
public FileInfo(string fileName){}
FileInfo的属性和方法
属性:
Exists :用于检查文件是否存在;
DirectoryInfo Directory:
string DirectoryName:文件所在目录;
long Length:文件大小;
override string Name :文件名称;
方法:
Delete() :这个删除方法是没有参数的;
CopyTo(string path) :复制,这里的path是指新路径;
MoveTo(string destFileName) :移动,这里的destFileName是指新路径;
FileSystemInfo类是FileInfo的父类;
string FullPath :全路径;
string Extension :后缀;
这里也是和File一样的,还有其他方法可以查看源码进行学习;
2、目录
目录也有两个类分别是Directory和DirectoryInfo
1、Directory-----静态类
Directory的方法:
bool Exists(string path) :检查指定的文件是否存在;
void Move(string sourceDirName,string destDirName) :移动文件
void Delete(string path,bool recursive) :删除,当recursive为true时,连同子目录中的所有内容都删除;
DateTime GetCreationTime(string path) :得到该文件创建的时间;
String[] GetDirectories(string path) :得到所有的子目录;
String[] GetFiles(string path):得到所有子文件;
以上是比较常用的方法,需要学习更多的方法请查看源码;
2、DirectoryInfo -----非静态类
创建:public DirectoryInfo(string path);
属性:
override bool Exists :检查指定文件是否存在;
string Name:文件名;
DirectoryInfo Parent :拿到父目录
方法:
void Delete() 删除,前提是目录里没有其他文件,否则会报错;
void Delete(bool recursive) :当recursion为true时连同子目录中的所有内容都删除;
DirectoryInfo[] GetDirectories() :得到所有子目录;
DirectoryInfo[] GetFiles() :得到所有子文件;
需要其他方法的可以查看源码;
3、静态类和非静态类的区别
静态类 | 非静态类 |
---|---|
只包含静态成员 | 可以包含静态成员 |
不可以包含实例成员 | 可以包含实例化成员 |
使用类名调用静态成员 | 使用实例对象调用非静态成员 |
不能被实例化 | 可以被实例化 |
不能包含实例构造函数 | 可以包含实例构造函数 |
用static修饰 | 不用static修饰 |
定义类中的静态成员的语法:
class 类名
{
public static 数据类型 变量名;
public static 返回值 方法名(参数列表)
{
//方法体
}
}