知识问答

C#基础知识之FileStream

C#基础知识之FileStream

什么是FileStream?

在C#中,FileStream是操作文件的一个类。通过FileStream,可以对一个文件进行读取、写入、修改等操作。在进行文件处理时,FileStream是一个非常重要的工具。

FileStream的基本用法

创建FileStream对象时,会需要传递文件的路径、文件打开方式等参数。常见的打开方式有:

  • FileMode.Create:创建一个新文件。如果文件已经存在,就先清空原有内容
  • FileMode.CreateNew:创建一个新文件。如果文件已经存在,会抛出异常
  • FileMode.Open:打开一个已经存在的文件
  • FileMode.OpenOrCreate:如果文件存在,就打开文件;如果文件不存在,就创建一个新文件。

创建FileStream对象示例:

FileStream fs = new FileStream("test.txt", FileMode.Create);

接下来可以通过FileStream对象调用Read()、Write()等方法进行操作,并最终使用Close()方法关闭文件流。

这样使用FileStream可能会存在文件打开后忘记关闭的问题,为了避免这种情况,可以使用using语句块。这样在代码执行完成后,会自动关闭FileStream对象。

使用using语句块示例:

using (FileStream fs = new FileStream("test.txt", FileMode.Create)) {    // Write操作    // ...} 

FileStream的读写操作

写操作

使用FileStream进行写操作时,会调用Write()方法。Write方法有多个不同参数的重载,最常用的是将字符串写入文件的方法。

使用Write方法进行字符串写入示例:

using (FileStream fs = new FileStream("test.txt", FileMode.Create)) {     string msg = "Hello, C# FileStream!";     byte[] buffer = Encoding.Default.GetBytes(msg);     fs.Write(buffer, 0, buffer.Length); } 

读操作

使用FileStream进行读操作时,会调用Read()方法。Read()方法有多个不同参数的重载,最常用的是读取文件所有字节的方法。

使用Read方法读取文件内容并输出示例:

using (FileStream fs = new FileStream("test.txt", FileMode.Open)) {     byte[] buffer = new byte[fs.Length];     fs.Read(buffer, 0, buffer.Length);     string msg = Encoding.Default.GetString(buffer);     Console.WriteLine(msg); } 

FileStream注意事项

  • 在使用FileStream时,需要保证文件是可访问的
  • 在写入操作时,需要注意文件是否存在。如果想要创建新文件,一定要使用Create或CreateNew方式
  • 在结束一个操作时,一定要关闭文件流。这可以使用Close()方法,或者使用using语句块

示例

读取二进制文件内容并写入新文件

// 读取源文件内容using (FileStream from = new FileStream("test.dat", FileMode.Open)){    byte[] buffer = new byte[from.Length];    from.Read(buffer, 0, buffer.Length);    // 将内容写入新文件    using (FileStream to = new FileStream("test_copy.dat", FileMode.Create))    {        to.Write(buffer, 0, buffer.Length);    }}

读取文件夹中的所有文件内容,并统计文件总字节数

// 声明文件夹路径string directoryPath = @"D:\test_folder\";// 获取文件夹中的所有文件string[] files = Directory.GetFiles(directoryPath);// 遍历所有文件,计算总字节数int totalBytes = 0;foreach(string file in files){    using (FileStream fs = new FileStream(file, FileMode.Open))    {        totalBytes += (int)fs.Length;    }}Console.WriteLine("The total bytes of all files is: " + totalBytes);