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
相关产品推荐
相关产品推荐

