使用StreamWriter/Reader读写同一文件引发异常的技术问询
看起来你遇到的这个“进程无法访问文件,因为它正被另一进程使用”异常,在文件IO操作里挺常见的,我帮你梳理几个最可能的原因和对应的排查、解决方法:
1. 自身代码的文件句柄未正确释放
这是最容易踩的坑!如果你的代码里使用了StreamReader、StreamWriter或者FileStream这类对象,但没有及时释放它们占用的文件句柄,就会导致文件被当前进程自己锁定,后续的读写操作自然就报错了。
举个反例,这样写肯定出问题:
// 错误示例:没释放reader就去写文件 var reader = new StreamReader("number.txt"); int num = int.Parse(reader.ReadLine()); // reader没关闭,文件还被占用 var writer = new StreamWriter("number.txt"); writer.WriteLine(num + 1); writer.Close();
正确的做法是用using语句,它会自动在代码块结束后释放资源:
int num; // 读取时用using包裹,确保读完就释放文件 using (var reader = new StreamReader("number.txt")) { num = int.Parse(reader.ReadLine()); } // 写入时同样用using,此时文件已经被释放,可以正常写入 using (var writer = new StreamWriter("number.txt")) { writer.WriteLine(num + 1); }
如果是手动管理资源,一定要记得在操作完成后调用Close()和Dispose(),不过using是更稳妥的方式。
2. 文件被其他外部进程占用
有时候不是你的代码问题,而是文件被其他程序“霸占”了。比如:
- 你用记事本、VS Code这类编辑器打开了这个文件,没关闭;
- 云同步工具(比如OneDrive、百度网盘)正在同步这个文件;
- 杀毒软件或者系统的文件索引服务在后台扫描、锁定文件。
这种情况下,哪怕你单独执行读或写操作,都会因为文件被外部进程占用而报错。
排查方法:
- 先关闭所有可能打开该文件的程序,再测试代码;
- Windows系统可以用「Process Explorer」工具来查哪个进程在占用文件:打开工具后按
Ctrl+F,输入你的文件名,就能找到对应的进程,结束它(注意别乱关系统进程)。
3. 文件共享模式设置不当
如果你的代码用File.Open这类方法直接操作文件流,但没有指定合适的共享权限,默认的模式可能会禁止同一进程的后续操作,甚至其他进程的访问。
比如默认情况下,用File.Open打开文件时,共享模式是FileShare.None,意味着其他任何操作(包括你自己进程的下一次读写)都无法访问这个文件:
// 错误示例:默认共享模式导致后续操作失败 var fs = File.Open("number.txt", FileMode.Open); // 这里读取后没关闭,或者后续再打开就会报错
解决方法是在打开文件时指定允许的共享模式,比如允许读写共享:
using (var fs = File.Open("number.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { // 执行读取操作 }
这样即使当前进程还没释放文件句柄,其他操作(包括自己的后续写入)也能访问文件(当然要注意线程安全问题,不过你是调试单步操作的话,这个模式足够)。
4. 安全软件的实时拦截
有些杀毒软件或者Windows Defender的实时保护功能,会在文件被读写时自动锁定文件进行扫描,这就会导致你的进程暂时无法访问文件,抛出异常。
排查方法:
- 临时关闭杀毒软件的实时保护(测试用,之后记得打开),再运行代码看是否还报错;
- 如果是Windows Defender,可以把你的测试文件所在的文件夹添加到“排除项”里。
快速排查步骤总结
- 先检查代码里所有文件操作是否都用
using包裹,确保资源释放; - 关闭所有可能打开该文件的外部程序;
- 用进程工具排查是否有其他进程占用文件;
- 临时关闭安全软件测试;
- 检查文件打开时的共享模式是否正确。
按照这个顺序排查,应该能很快找到问题所在!
内容的提问来源于stack exchange,提问作者CodingYoshi

