You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:02