VB.NET使用StreamReader和StreamWriter操作txt文件报进程占用错误如何解决
报错原因
你抛出IO异常的核心原因是同时实例化了StreamReader和StreamWriter两个对象占用同一个Data.txt文件,默认情况下Windows的文件锁机制不允许多个未配置共享权限的流同时操作同一个文件,直接触发进程占用错误。
除此之外你的原有代码还存在多处逻辑缺陷:
- 邮箱校验逻辑错误:仅读取第一行数据判断邮箱是否重复,只要第一行邮箱不匹配就直接写入新用户并关闭写入流,后续行的重复邮箱完全没有校验
- 空引用风险:读到文件末尾的空值时调用
line.Split()会直接抛出空引用异常 - 流资源泄漏风险:如果代码中途抛出异常,手动写的
Close()方法不会执行,流会一直占用文件,后续操作都会报错 - 写入逻辑错误:默认实例化的
StreamWriter会直接覆盖整个文件内容,每注册一个新用户就会清空之前存储的所有账号
修复方案
调整操作顺序:先全量读取文件完成邮箱重复校验,读取流释放后再执行写入操作,同时使用Using语句自动管理流的生命周期,无需手动调用Close()方法,即便代码报错也会自动释放文件占用。
修改后的完整代码如下:
Private Sub btnSignIn_Click(sender As Object, e As EventArgs) Handles btnSignIn.Click Dim strEmail As String = txtEmail.Text.Trim() Dim strUserName As String = txtUserName.Text.Trim() Dim strPassword As String = txtPassword.Text.Trim() Dim Reg As New Regex("^\w+([-_.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$") ' 先做输入合法性校验 If strUserName = "" OrElse strEmail = "" OrElse strPassword = "" Then MsgBox("请填写所有必填项") Exit Sub End If If Not Reg.IsMatch(strEmail) Then MsgBox("请输入正确的邮箱格式") Exit Sub End If Dim isEmailExists As Boolean = False ' 第一步:只读打开文件,校验邮箱是否重复,Using会自动释放流 Using sr As New StreamReader("Data.txt") Dim line As String = "" Do While sr.Peek() <> -1 ' 用Peek判断是否到文件末尾,避免空值 line = sr.ReadLine() If String.IsNullOrEmpty(line) Then Continue Do Dim arrData As String() = line.Split(";"c) If arrData.Length >= 2 AndAlso arrData(1) = strEmail Then isEmailExists = True Exit Do ' 找到重复就提前退出循环 End If Loop End Using ' 执行到这里Reader已经释放,文件锁解除 If isEmailExists Then MsgBox("该邮箱已注册,请更换邮箱") Exit Sub End If ' 第二步:校验通过后,追加模式写入新用户信息 Using sw As New StreamWriter("Data.txt", True) ' 第二个参数True表示追加内容,不覆盖原文件 Dim strPerson As String = $"{strUserName};{strEmail};{strPassword}" sw.WriteLine(strPerson) End Using MsgBox("注册成功") End Sub
内容的提问来源于stack exchange,提问作者user17514699
相关产品推荐
相关产品推荐

