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

VB项目多窗体共用文本文件出现‘文件已打开’报错的技术咨询

解决VB文本文件“已在别处打开”错误的方案

你代码里的核心问题是:打开StreamWriter后立刻用File.ReadAllLines读取同一个文件——此时文件已被StreamWriter锁定,导致读取失败;另外FileClose()是VB6的旧方法,无法关闭.NET的StreamWriter,等于没释放文件资源。

下面给出两种可行的解决办法:

办法1:修复文件读写的资源占用问题

调整预订页面btnBook_Click的代码顺序,并用正确方式管理文件流:

Private Sub btnBook_Click(sender As Object, e As EventArgs) Handles btnBook.Click
    Dim NewBooking As Bookings
    Dim errorFlag As Boolean = False
    Dim bookingID As Integer = 0

    ' 检查输入合法性
    If txtID.Text = "" Or drpNumGuests.Text = "Please Select" Or txtCheckin.Text = "" Or txtCheckout.Text = "" Or txtRoomNo.Text = "" Then
        errorFlag = True
    End If

    If errorFlag Then
        MsgBox("输入数据有误,请重试。")
    Else
        ' 先读取文件获取预订ID(此时文件未被占用)
        Dim Booking() As String = File.ReadAllLines("Bookings.txt")
        If UBound(Booking) >= 0 Then
            bookingID = Int(Booking(UBound(Booking)).Substring(0, 8)) + 1
        End If

        ' 填充预订数据
        NewBooking.GuestID = LSet(txtID.Text, 9)
        NewBooking.BookingID = LSet(Str(bookingID), 9)
        NewBooking.Name = LSet(txtName.Text, 25)
        NewBooking.GuestNum = LSet(drpNumGuests.Text, 2)
        NewBooking.CheckIn = LSet(txtCheckin.Text, 11)
        NewBooking.CheckOut = LSet(txtCheckout.Text, 11)
        NewBooking.RoomNum = LSet(txtRoomNo.Text, 3)
        NewBooking.Requests = txtRequests.Text

        ' 使用Using自动管理StreamWriter,代码块结束后自动关闭文件
        Using sw As New System.IO.StreamWriter("Bookings.txt", True)
            sw.WriteLine(NewBooking.GuestID & NewBooking.BookingID & NewBooking.Name & NewBooking.GuestNum & NewBooking.CheckIn & NewBooking.CheckOut & NewBooking.RoomNum & NewBooking.Requests)
        End Using

        MsgBox("预订完成")
    End If
End Sub

关键修改点:

  • 调换读写顺序:先读取文件获取预订ID,再打开StreamWriter写入,避免同一时间占用文件
  • 用Using包裹StreamWriter,自动释放文件资源,替代无效的FileClose()

办法2:直接传递预订数据到确认窗体(更适合原型)

既然只是原型,完全可以跳过文件读取环节,直接把当前预订数据传递给确认窗体,既避免文件冲突,又简化代码:

步骤1:在确认窗体添加接收数据的属性

在Booking_Confirmation窗体中添加:

Public CurrentBooking As Bookings

步骤2:修改预订页面的跳转逻辑

把NewBooking设为模块级变量(或在btnBook_Click中存储为全局变量),然后传递给确认窗体:

Private Sub btnConfirm_Click(sender As Object, e As EventArgs) Handles btnConfirm.Click
    Booking_Confirmation.CurrentBooking = NewBooking
    Booking_Confirmation.Show()
    Me.Hide()
End Sub

步骤3:修改确认页面的生成逻辑

直接使用传递过来的数据生成确认信息:

Private Sub btnGen_Click(sender As Object, e As EventArgs) Handles btnGen.Click
    Dim booking = CurrentBooking
    txtConfirmation.Text = booking.GuestID.Trim() & "  感谢 " & booking.Name.Trim() & " 预订我们的住宿。您的" & booking.GuestNum.Trim() & "人预订已确认,入住日期:" & booking.CheckIn.Trim() & ",退房日期:" & booking.CheckOut.Trim() & vbCrLf & "期待您的到来,您的预订编号是:" & booking.BookingID.Trim()
End Sub

这种方式完全绕开了文件读写的冲突,代码更简洁,也符合原型快速实现的需求。

内容的提问来源于stack exchange,提问作者Fearne Townsend

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:05:24