C#之文件操作
目录
一、字节数组
1、数据类型与字节数组的相互转换(BitConverter)
// 各类型转字节数组
byte[] bytes = BitConverter.GetBytes(value);
// 字节数组转各类型(int为例)
int i = BitConverter.ToInt32(bytes, startIndex);
2、字符串与字节数组的相互转换(Encoding)
// 字符串转字节数组(UTF-8为例)
byte[] bytes = Encoding.UTF8.GetBytes(s);
// 字节数组转字符串(UTF-8为例)
string s = Encoding.UTF8.GetString(bytes); // 读取全部字节数组
string s2 = Encoding.UTF8.GetString(bytes, index, count); // 读取部分字节数组
二、File类
1、判断文件是否存在
File.Exists(path);
2、创建文件
FileStream fs = File.Create(path);
3、写入文件
// 写入字节数组
File.WriteAllBytes(path, bytes);
// 将string数组一行行写入文件
File.WriteAllLines(path, contents);
// 写入字符串
File.WriteAllText(path3, str);
4、读取文件
// 读取字节数组
byte[] bytes = File.ReadAllBytes(path);
// 读取所有行信息
string[] strs = File.ReadAllLines(path);
// 读取字符串
string str = File.ReadAllText(path);
5、删除文件
File.Delete(path);
6、复制文件
File.Copy(source, dest); // 复制源文件到目标文件
File.Copy(source, dest, overwrite); // 第三个参数代表是否覆盖目标文件
7、文件替换
File.Replace(source, dest); // 用源文件替换目标文件(source消失,变成dest)
File.Replace(source, dest, backup); // 第三个参数用于备份被替换的dest文件
8、打开文件
FileStream fs = File.Open(path, fileMode, fileAccess, fileShare);
9、文件相关枚举
这些枚举会在方法重载中出现。
- FileMode:文件打开模式
CreateNew:创建新文件;若文件已存在则抛出异常Create:创建文件;若文件已存在则覆盖原有内容Open:打开文件;若文件不存在则抛出异常OpenOrCreate:若文件存在则打开文件,不存在则创建新文件Append:若文件存在则打开并定位到文件末尾;不存在则创建新文件Truncate:打开文件并清空文件内容
- FileAccess:访问模式
Read:只读模式Write:只写模式ReadWrite:读写模式
- FileShare:共享权限
None:谢绝共享Read:允许其他进程读取当前文件Write:允许其他进程写入 / 修改当前文件ReadWrite:允许其他进程同时读取和写入该文件
- FileOptions:如何创建或覆盖该文件
Asynchronous:可用于异步读写文件DeleteOnClose:流关闭后自动删除文件,常用于临时文件Encrypted:文件被加密,只有创建者才能解密读取None:不应用任何特殊选项RandomAccess:随机访问文件,适合频繁跳转到不同位置读写SequentialScan:从头到尾顺序访问文件,适合流式读取WriteThrough:写入操作绕过缓存,直接写入磁盘
三、FileStream类
1、文件流
文件流主要用于读写文件的细节方面,File类只能整体或者一次性的读写文件,而FileStream类可以以读写字节的形式处理文件。
通过FileStream可以一部分一部分的读写数据流,即以流的方式逐个读写。
2、打开或创建指定文件
// 方式一(new对象)
FileStream fs = new FileStream(path, fileMode);
// 方式二(Create)
FileStream fs = File.Create(path);
// 方式三(Open)
FileStream fs = File.Open(path);
3、常用属性
fs.Length; // 文本字节长度
fs.CanRead; // 是否可读
fs.CanWrite; // 是否可写
4、常用方法
fs.Close()和fs.Dispose()内部会自动调用Flush()
fs.Flush(); // 把内存里缓存数据,立刻写到硬盘里(写入后一定要执行一次,避免数据丢失)
fs.Close(); // 关闭流(文件读写完后一定要执行)
fs.Dispose(); // 销毁回收缓存资源
5、写入文件
fs.Write(bytes, offset, count); // 参数:字节数组、起始位置和读取字节数
- 写入字符串时,需要先写入字符串长度,再写入内容,这样方便知道读取的字符串长度:
byte[] bytes = Encoding.UTF8.GetBytes("Hello World");
fs.Write(BitConverter.GetBytes(bytes.Length), 0, 4); // 写入长度
fs.Write(bytes, 0, bytes.Length); // 写入内容
6、读取文件
- 该方法将读取的内容填充到字节数组
bytes参数中,同时返回值表示当前流索引前进了几个位置。 - 流索引:当前文件流正在读写的位置,从0开始计数,读写一个字节就自动往后跳一位。
int index = fs.Read(bytes, offset, count); // 参数:字节数组、容器中的起始位置、读取多少字节进入容器
7、安全的引用文件流对象
- using语句块结束后,会自动调用该对象的销毁方法(Dispose)。
using (引用对象)
{
// ...
}
四、Directory类
1、判断文件夹是否存在
Directory.Exists(path);
2、创建文件夹
Directory.CreateDirectory(path);
3、删除文件夹
Directory.Delete(path, recursive); // 第二个参数代表是否递归删除目录(即删除非空目录)
4、查找文件夹和文件
// 获取指定路径的所有文件夹
Directory.GetDirectories();
// 获取指定路径的所有文件
Directory.GetFiles();
5、移动文件夹
Directory.Move(source, dest);
6、获取父级文件夹
Directory.GetParent(path);
7、DirectoryInfo
- 包含文件夹的信息,通过
CreateDirectory和GetParent等方法的返回值可以得到
directoryInfo.FullName; // 全路径名
directoryInfo.Name; // 文件名
directoryInfo.GetDirectories(); // 获取所有子文件夹信息
directoryInfo.GetFiles(); // 获取当前目录下的所有文件信息
8、FileInfo
- 包含文件的信息,可以通过
DirectoryInfo.GetFiles()等方法的返回值得到
fileInfo.FullName; // 全路径名
fileInfo.Name; // 文件名
fileInfo.Length; // 字节长度
fileInfo.Extension; // 后缀名
FileStream fs = fileInfo.Open(fileMode); // 打开文件