C# FileStream读写二进制文件 作者:马育民 • 2025-07-01 15:22 • 阅读:10000 # 介绍 读写文件的字节流,是底层流 命名空间:`System.IO` 官网:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.filestream?view=net-6.0 # 构造方法 ``` FileStream(String, FileMode, FileAccess) 使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。 ``` ``` FileStream(String, FileMode, FileAccess, FileShare) 使用指定的路径、创建模式、读/写权限和共享权限初始化 FileStream 类的新实例。 ``` ``` FileStream(String, FileMode, FileAccess, FileShare, Int32) 使用指定的路径、创建模式、读/写和共享权限以及缓冲区大小初始化 FileStream 类的新实例。 ``` ``` FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) 使用指定的路径、创建模式、读/写和共享权限、缓冲区大小以及同步或异步状态初始化 FileStream 类的新实例。 ``` ``` FileStream(String, FileMode, FileAccess, FileShare, Int32, FileOptions) 使用指定的路径、创建模式、读/写和共享权限初始化 FileStream 类的新实例,访问其他 FileStreams 可以具有相同的文件、缓冲区大小和其他文件选项。 ``` ``` FileStream(String, FileStreamOptions) 使用指定的路径、创建模式、读/写和共享权限、缓冲区大小、其他文件选项、预分配大小以及其他 FileStreams 可以访问同一文件初始化 FileStream 类的新实例。 ``` # FileMode 枚举 指定操作系统打开文件的方式。 命名空间:`System.IO` 官网:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.fileaccess?view=net-6.0 |名称|值|说明| |---|---|---| |Append|6|若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件。 这需要 Append 权限。 FileMode.Append 只能与 FileAccess.Write 一起使用。 试图查找文件尾之前的位置时会引发 IOException 异常,并且任何试图读取的操作都会失败并引发 NotSupportedException 异常。| |Create|2|指定操作系统应创建新文件。 如果此文件已存在,则会将其覆盖。 这需要 Write 权限。 FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。 如果该文件已存在但为隐藏文件,则将引发 UnauthorizedAccessException异常。| |CreateNew|1|指定操作系统应创建新文件。 这需要 Write 权限。 如果文件已存在,则将引发 IOException异常。| |Open|3|指定操作系统应打开现有文件。 打开文件的能力取决于 FileAccess 枚举所指定的值。 如果文件不存在,引发一个 FileNotFoundException 异常。| |OpenOrCreate|4|指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 FileAccess.Read 打开文件,则需要 Read权限。 如果文件访问为 FileAccess.Write,则需要 Write权限。 如果用 FileAccess.ReadWrite 打开文件,则同时需要 Read 和 Write权限。| |Truncate|5|指定操作系统应打开现有文件。 该文件被打开时,将被截断为零字节大小。 这需要 Write 权限。 尝试从使用 FileMode.Truncate 打开的文件中进行读取将导致 ArgumentException 异常。| ### FileAccess 枚举 定义文件的读取、写入或读/写访问权限的常量 命名空间:`System.IO` 官网:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.fileaccess?view=net-6.0 |名称|值|说明| |---|---|---| |Read|1|对文件的读访问。 可从文件中读取数据。| |ReadWrite|3|对文件的读写访问权限。 可从文件读取数据和将数据写入文件。| |Write|2|文件的写访问。 可将数据写入文件。| # 属性 |属性|解释| |---|---| |CanRead|获取一个值,该值指示当前流是否支持读取。| |CanSeek|获取一个值,该值指示当前流是否支持查找。| |CanWrite|获取一个值,该值指示当前流是否支持写入。| |Length|获取流的长度(以字节为单位)。| |Name|获取在 FileStream中打开的文件的绝对路径。| |Position|获取或设置此流的当前位置。| # 方法 |方法|解释| |---|---| |Close()|关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄)。 请确保流已正确释放,而不是调用此方法。(继承自 Stream)| |Dispose()|释放 Stream使用的所有资源。(继承自 Stream)| |Dispose(Boolean)|释放 FileStream 使用的非托管资源,并选择性地释放托管资源。| |Flush()|清除此流的缓冲区,并导致任何缓冲数据写入文件。| |Flush(Boolean)|清除此流的缓冲区,并导致任何缓冲数据写入文件,并清除所有中间文件缓冲区。| |Read(Byte[], Int32, Int32)|从流中读取字节块并写入给定缓冲区中的数据。| |ReadByte()|从文件中读取字节,并提升一个字节的读取位置。| |Seek(Int64, SeekOrigin)|将此流的当前位置设置为给定值。| |Write(Byte[], Int32, Int32)|将字节块写入文件流。| |WriteByte(Byte)|将字节写入文件流中的当前位置。| # 例子-写入 ``` FileStream F = new FileStream("test.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite); for (int i = 1; i <= 20; i++) { F.WriteByte((byte)i); } F.Close(); Console.ReadKey(); ``` # 例子-读取 ``` FileStream F = new FileStream("test.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite); for (int i = 0; i <= 20; i++) { Console.Write(F.ReadByte() + " "); } F.Close(); Console.ReadKey(); ``` 原文出处:http://malaoshi.top/show_1GW1PXxOBfEv.html