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

  • 包含文件夹的信息,通过CreateDirectoryGetParent等方法的返回值可以得到
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); // 打开文件