讲师中心 微信公众号
AI工具推荐 视频效率加速

C# 文件流操作方法 C#如何使用FileStream

胖婷同学_4839

胖婷同学_4839

发布时间:2026-01-20 13:41:03

|

951人浏览过

|

来源于php中文网

原创

FileStream构造函数参数必须匹配:FileMode决定文件行为,FileAccess指定操作类型,二者需兼容(如Append仅允许Write),FileShare控制并发访问;using管理是必须的,确保及时释放句柄;Read/Write返回值不可忽略,需循环处理以保证全部数据完成。

c# 文件流操作方法 c#如何使用filestream

FileStream 构造函数参数怎么选

创建 FileStream 最容易出错的地方是构造函数参数组合不匹配。比如用 FileMode.Create 却传了 FileAccess.Read,运行时直接抛 ArgumentException:“The file access requested is not compatible with the access required by the file mode.”

  • FileMode 决定文件存在与否时的行为(如 Create 总是清空重写,OpenOrCreate 存在则打开、不存在则新建)
  • FileAccess 是你打算对流做的操作(Read / Write / ReadWrite),必须和 FileMode 兼容:比如 FileMode.Append 只允许 FileAccess.Write
  • FileShare 控制其他进程能否同时访问该文件;默认 FileShare.None 会独占锁,若另一程序正读这个文件,你的 FileStream 就会阻塞或抛 IOException

用 using 管理 FileStream 是必须的吗

是。不显式调用 Dispose() 或不用 using,文件句柄不会立即释放,可能导致后续操作失败(如“文件正由另一进程使用”)、磁盘空间无法回收、甚至 AppDomain 卸载异常。

常见错误写法:

FileStream fs = new FileStream("log.txt", FileMode.Append, FileAccess.Write);
fs.Write(buffer, 0, buffer.Length);
// 忘了 fs.Close() 或 fs.Dispose()

正确写法:

using (FileStream fs = new FileStream("log.txt", FileMode.Append, FileAccess.Write, FileShare.Read))
{
    fs.Write(buffer, 0, buffer.Length);
} // 自动调用 Dispose,释放句柄并刷新缓冲区

  • 即使发生异常,using 块仍保证 Dispose() 被调用
  • 如果手动管理,必须在 finally 中调用 Dispose(),且要判空
  • FileStreamDispose() 会隐式调用 Flush(),但不保证磁盘落盘(需配合 Flush(true) 强制写入物理设备)

Read/Write 方法返回值为什么不能忽略

FileStream.Read()FileStream.Write() 都返回实际操作的字节数,不是“成功就返回传入长度”。尤其在网络映射盘、加密文件系统或磁盘满时,可能只写入部分数据却无异常抛出。

Wikclawpedia Archive Access
Wikclawpedia Archive Access

访问、搜索、检索并提交 Wikclawpedia 代理档案中经核实的代理、平台、瞬间、语录和创作者条目。

下载

典型误用:

fs.Write(buffer, 0, buffer.Length); // ❌ 假设全部写完

安全写法:

int totalWritten = 0;
while (totalWritten < buffer.Length)
{
    int written = fs.Write(buffer, totalWritten, buffer.Length - totalWritten);
    if (written == 0) throw new IOException("Write returned 0 bytes — stream may be closed or full.");
    totalWritten += written;
}

  • Read() 同理:返回 0 表示已到流末尾,不是“读完了所有请求字节”
  • 同步 I/O 下,Read() 可能一次只读几字节(尤其小缓冲区 + 大文件)
  • 若需原子性写入,应先写临时文件,再 File.Move() 替换原文件

FileStream 和 File 类方法有什么本质区别

File.OpenRead()File.ReadAllBytes() 这些是封装好的快捷方式,底层仍用 FileStream,但它们隐藏了生命周期控制和缓冲策略细节。

  • File.ReadAllBytes("a.bin") 会一次性把整个文件加载进内存 —— 文件超 100MB 就容易 OOM
  • File.Copy() 默认不保留 NTFS 权限或时间戳,而用 FileStream 手动复制可控制每个字节、加进度回调、做校验
  • 高频小文件写入(如日志)用 FileStream 配合 BufferedStream 更可控;简单读取配置可用 File.ReadAllText()
  • FileStream 支持 Seek() 随机读写,File 类静态方法全是一次性顺序操作

真正需要精细控制 I/O 行为、处理大文件、或避免内存暴涨时,绕不开直接用 FileStream。其他情况,优先选 File 类方法更简洁安全。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
append用法
append用法

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

578

2023.10.25

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

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

1476

2023.11.14

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

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

1964

2025.09.12

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2167

2023.10.09

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2753

2023.10.16

asp连接access数据库的方法
asp连接access数据库的方法

连接的方法:1、使用ADO连接数据库;2、使用DSN连接数据库;3、使用连接字符串连接数据库。想了解更详细的asp连接access数据库的方法,可以阅读本专题下面的文章。

2073

2023.10.18

access和trunk端口的区别
access和trunk端口的区别

access和trunk端口的区别是Access端口用于连接终端设备,提供单个VLAN的接入,而Trunk端口用于连接交换机之间,提供多个VLAN的传输;Access端口只传输属于指定VLAN的数据,而Trunk端口可以传输多个VLAN的数据,并使用VLAN标签进行区分。想了解更多access和trunk端口相关内容,可以阅读本专题下面的文章。

448

2023.10.31

access怎么导入数据
access怎么导入数据

access导入数据步骤:1. 选择数据源 2. 选择要导入的文件 3. 指定导入选项 4. 选择导入目标 5. 预览数据 6. 导入数据即可。想了解更多access的相关内容,可以阅读本专题下面的文章。

3945

2024.04.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn