0

0

c# 文件流 filestream 怎么用

煙雲

煙雲

发布时间:2026-02-28 00:13:26

|

693人浏览过

|

来源于php中文网

原创

filestream必须用using确保安全释放句柄并检查read/write返回值,否则易锁文件、读乱码或处理错误数据; filemode与fileaccess需严格配对,缓冲区读写须循环判断实际字节数。

c# 文件流 filestream 怎么用

FileStream 是 C# 里操作文件最底层、最灵活的字节流工具,不是“怎么用”,而是“必须知道怎么安全地用”——它不自动释放句柄,不处理编码,不跳过空格,写错一个参数就可能锁死文件、读出乱码、或在大文件上卡死。


创建 FileStream 必须配对 FileMode 和 FileAccess

常见错误:只传路径和 FileMode,却没指定 FileAccess,结果默认是 ReadWrite,但你只想读——系统就抛 UnauthorizedAccessException

  • FileMode.Open + FileAccess.Read:安全读已有文件(文件不存在就崩)
  • FileMode.Create + FileAccess.Write:清空重写,不怕文件存在,但会丢数据
  • FileMode.Append + FileAccess.Write:只能写末尾,且不能搭配 Read
  • FileMode.OpenOrCreate + FileAccess.ReadWrite:适合读写日志类文件,但要自己判断是否首次创建(fs.Length == 0
using (var fs = new FileStream("data.bin", FileMode.Open, FileAccess.Read))
{
    byte[] buf = new byte[4096];
    int read = fs.Read(buf, 0, buf.Length); // 注意:返回值是实际读到的字节数,不是 buffer.Length
}

读大文件别一次性 LoadAll,要用 while 循环 + Read 返回值判断

直接 fs.Read(buf, 0, buf.Length) 并不保证填满 buf——网络磁盘、权限受限、甚至文件被其他进程截断,都可能导致 read 。忽略返回值,就会把残留旧数据当新内容处理。

云网OA
云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

下载
  • Read 返回 0 表示已到文件末尾(不是“没读到”,是“真读完了”)
  • 永远用 while ((n = fs.Read(buf, 0, buf.Length)) > 0),而不是 while (fs.Position (后者在异步/网络文件系统下不准)
  • 缓冲区大小建议设为 40968192:太小频繁调用系统 API,太大吃内存又无增益

写文件必须用 using,否则文件锁死、后续程序打不开

FileStream 持有操作系统级文件句柄,不用 using 或手动 Dispose(),句柄不会释放——哪怕方法执行完,文件仍被“占用中”,Windows 资源管理器提示“正在被另一个程序使用”,VS 编译报“无法访问该文件,因为它正由另一进程使用”。

  • using 是唯一推荐方式;不用 using 就必须三连:fs.Flush()fs.Close()fs.Dispose()
  • Flush() 不是可选:尤其写小数据时,内容还在内核缓冲区,Close() 会隐式 Flush,但显式调更可控
  • 别信“GC 会回收”——FileStream 包含 SafeFileHandle,是非托管资源,GC 不管它
string text = "Hello, world!";
byte[] bytes = Encoding.UTF8.GetBytes(text);
using (var fs = new FileStream("out.txt", FileMode.Append, FileAccess.Write, FileShare.Read))
{
    fs.Write(bytes, 0, bytes.Length); // Append 模式下,自动 seek 到末尾
}

随机访问文件?Seek 是唯一可靠方式,但注意 Position 单位是字节

想跳到第 100 行?不行。Seek 只认字节偏移,不认换行符。文本文件里一行多少字节取决于编码(UTF8 中中文占 3 字节,ASCII 英文占 1 字节),所以“跳到第 N 行”必须自己解析,Seek 只能用于二进制结构化文件(如自定义头+数据块)。

  • fs.Seek(1024, SeekOrigin.Begin):从开头跳 1024 字节
  • fs.Seek(-5, SeekOrigin.Current):往回退 5 字节(要求 CanSeek == trueAppend 模式下为 false
  • Seek 前务必检查 fs.CanSeek,否则运行时报 NotSupportedException
  • Position 是属性,可读可写,但写入非法位置(如负数)会立刻抛异常

真正容易被忽略的点就两个:一是所有 Read/Write 都必须检查返回值,二是 using 不是语法糖,是保命机制。其他花哨功能,比如异步 ReadAsync、共享模式 FileShare.Delete,都是在踩稳这俩地基之后才值得碰的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

348

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1080

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

181

2025.09.12

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.12.29

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

2

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.8万人学习

C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号