C#怎么读写文件_C#读取和写入文本文件教程【干货】
C#文件读写需根据场景选择方法。小文本文件使用File.ReadAllText/WriteAllText最简便;大文件或需逐行处理时,必须用StreamReader/StreamWriter配合using语句确保资源释放;二进制内容则用ReadAllBytes/WriteAllBytes。注意编码、路径拼接使用Path.Combine,以及多线程写入时需手动
文件读写是编程中的基础操作,但在C#里,选错方法带来的麻烦可不少——轻则乱码,重则数据丢失或程序崩溃。今天咱们就彻底理清不同场景下的正确姿势。

核心原则其实就一句话:小文件用File.ReadAllText/WriteAllText最简高效,大文件或逐行处理必须用StreamReader/StreamWriter配合using,二进制内容一律用ReadAllBytes/WriteAllBytes。 混用这套规则,乱码、截断或权限异常这些问题就会找上门。
小文本文件:File.ReadAllText 和 File.WriteAllText 最快
处理配置文件、短日志片段或JSON字符串这类几MB以内的文本,这两个方法是首选。它们内部封装了流的打开、关闭和编码处理,你不需要手动写using或try-finally,代码非常简洁。
- 路径与异常:
File.ReadAllText("config.json")在文件不存在时会直接抛出FileNotFoundException。而File.WriteAllText如果遇到父目录不存在,会报DirectoryNotFoundException——它不会尝试创建目录,这一点需要留意。 - 追加内容:别想着用
WriteAllText去追加内容,它会直接覆盖整个文件。正确的做法是使用File.AppendAllText("log.txt", "[warn] timeout")。 - 编码问题:遇到乱码?很可能是默认编码不匹配。显式传入编码参数就能解决,例如
File.ReadAllText("data.txt", Encoding.GetEncoding("GB2312"))。 - 行读取变体:
File.ReadAllLines("list.txt")会返回一个string[],每行末尾的换行符已被移除。如果需要处理大文件但又想逐行操作,File.ReadLines("huge.log")返回的是IEnumerable,支持延迟加载,内存更友好,但要注意它本质上仍是顺序遍历,如果只是想跳过文件开头部分,它的效率并不比StreamReader高。
大文件或逐行处理:必须用 StreamReader + using
面对几十MB以上的文本文件,或者需要边读边过滤(如CSV解析、实时日志扫描)的场景,把整个文件读进内存绝对是下策。这时必须手动控制流,而using语句是确保资源释放的生命线,漏掉它就意味着文件句柄可能一直被占用,导致后续操作失败。
- 行结束符:
StreamReader.ReadLine()返回的字符串不包含换行符。无论是Windows的、Mac的还是Unix的,它都能正确识别并剥离。 - 异步读取:使用
ReadLineAsync()进行异步读取时,如果在UI线程上下文中调用,需警惕同步上下文导致的死锁。一个良好的实践是加上ConfigureAwait(false)。 - 追加写入:用
StreamWriter写入时,如果需要追加而非覆盖,务必在构造函数中传入append: true参数,否则默认的FileMode.Create会清空原有文件内容。 - 资源释放:切忌手动调用
Close()或Dispose()。using块在编译后会自动生成正确的try-finally结构,手动管理反而容易在异常路径下遗漏。
二进制文件:绕过编码,只认字节
处理图片、PDF、加密密钥或序列化对象等非文本内容时,必须忘记那些文本读写方法。用ReadAllText去读二进制文件,系统会试图用编码解释字节流,结果不是产生乱码,就是抛出DecoderFallbackException异常。
- 字节操作:
File.ReadAllBytes("photo.jpg")直接返回byte[],完整保留所有字节;File.WriteAllBytes("backup.bin", data)也是原样写入字节数组。 - 流式处理:对于超大二进制文件(比如视频分片上传),应该使用
FileStream配合缓冲区进行读写,避免一次性分配数百MB的内存。 - 路径安全:路径中包含中文或特殊字符时,使用
Path.Combine("data", "用户配置.bin")比手动拼接字符串更安全,跨平台兼容性也更好。 - 写入预检:
File.WriteAllBytes不会预先检查磁盘空间或权限,只在失败时抛出IOException或UnauthorizedAccessException。在关键业务路径上,需要自己做好try-catch处理。
最后,有两个容易被忽略但至关重要的点:路径处理和并发安全。拼接路径时,务必使用Path.Combine,而不是简单的字符串相加(如"C:\folder\" + name)。当多个线程或进程需要同时写入同一个文件时,File.WriteAllText这类方法不提供任何锁机制,数据丢失几乎是必然的。这种情况下,必须使用FileStream并手动设置FileShare.None,或者借助外部的同步机制(如Mutex)来保证数据一致性。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















