C#使用StreamReader读取文件时遇“文件被其他进程占用”错误求助
解决文件被占用导致StreamReader读取不完整的问题
哥们,我之前也踩过一模一样的坑!你碰到的The process cannot access the file because it is being used by another process错误,本质就是文件句柄没正确释放,或者真的有其他进程在占用你的文本文件,导致StreamReader没法完整读取62条记录,只成功插入了58条。下面给你几个针对性的解决方案:
1. 先排查外部进程占用
首先确认这个文本文件是不是被其他程序“霸占”了——比如你是不是用记事本、Excel或者其他编辑器打开着没关?或者有没有后台服务、其他脚本在偷偷读写这个文件?
- Windows下可以打开资源监视器,在“关联的句柄”里搜索文件名,找到占用的进程并关闭;
- Linux/macOS可以用
lsof 文件名命令查看占用进程。
2. 用using语句确保资源自动释放
大概率是你的代码没有正确关闭StreamReader,导致文件句柄一直被占用,后续读取就报错了。C#里的using语句会自动帮你释放IDisposable资源,不管有没有异常都能保证流被关闭。
结合你给出的代码片段,修正后的示例如下:
if (postedFile.ContentLength > 0) { // 用using包裹StreamReader,自动释放文件资源 using (StreamReader reader = new StreamReader(postedFile.InputStream)) { string line; int totalRecords = 0; while ((line = reader.ReadLine()) != null) { totalRecords++; try { // 这里写你的插入记录逻辑 InsertRecord(line); } catch (IOException ex) { // 记录错误日志,方便定位哪条记录失败 Console.WriteLine($"第{totalRecords}条记录插入失败: {ex.Message}"); // 可以加个简单的重试逻辑,避免直接丢数据 for (int retry = 0; retry < 2; retry++) { try { InsertRecord(line); break; } catch { // 重试失败就跳过或继续记录日志 } } } } } }
3. 指定文件共享模式(如果是并发场景)
如果你的程序是多线程或者多进程同时访问这个文件,打开StreamReader的时候要指定FileShare参数,允许其他进程读取:
using (StreamReader reader = new StreamReader( new FileStream("你的文件路径", FileMode.Open, FileAccess.Read, FileShare.Read))) { // 读取逻辑 }
这样即使其他进程在读取这个文件,你的程序也能正常访问。
4. 检查插入逻辑是否“自占用”文件
另外还要确认你的InsertRecord方法里有没有不小心再次打开这个文件却没释放?比如插入时需要读取文件的其他内容,却没关闭流,也会导致文件被自己的进程占用。
按照上面的方法排查,应该就能解决只读取58条的问题啦!
内容的提问来源于stack exchange,提问作者Sarthak Sharma
相关产品推荐
相关产品推荐

