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

如何解决System.IO.IOException错误?教师管理系统文件写入报错求助

如何解决System.IO.IOException错误?教师管理系统文件写入报错求助

兄弟,我看了你的问题和代码,这个**System.IO.IOException(文件被其他进程占用)**的错误其实挺常见的,咱们一步步拆解问题,把它解决掉:

问题1:文件流未被安全释放,递归调用加剧资源冲突

你现在手动调用Close()关闭流,但递归调用AddTeacher()的时候,前一次的流可能还没完全释放,新的调用又去打开同一个文件,直接触发了“文件被占用”的错误。而且如果中间出现异常,Close()可能根本执行不到,导致流一直霸占着文件。

解决办法:用Using语句自动管理资源
Using会在代码块结束时自动释放文件流,不管有没有异常,比手动Close()靠谱得多,能从根源避免资源泄漏。

问题2:递归调用容易引发资源未及时释放

你用递归的方式重复添加教师,每次递归都会重新打开文件流,很容易造成资源冲突。换成循环(比如Do...Loop)会更稳妥,逻辑也更清晰,不会有递归带来的隐式资源问题。

问题3:数据类型转换的低级错误(隐形bug)

你代码里把很多字符串类型的输入(比如教师姓名、科目、密码)都用CInt()转成整数了,这肯定会炸!比如输入“张三”的时候,CInt()直接就报错,这个必须先修正,不然即使解决了IO错误,程序也跑不起来。


修改后的完整代码示例

Sub AddTeacher()
    Dim Answer As String
    Do
        ' 用Using自动管理FileStream和BinaryWriter的资源
        Using FileName As New FileStream("C:\TNSMS\Teachers.dat", FileMode.Append) ' 改成Append,避免每次添加覆盖原有数据
            Using FileNameWriter As New BinaryWriter(FileName)
                Dim OneTeacher As New Teacher ' 别忘了实例化Teacher对象!

                Console.Write("Teacher ID          :")
                OneTeacher.TeacherID = CInt(Console.ReadLine())
                FileNameWriter.Write(OneTeacher.TeacherID)

                Console.Write("Teacher's Gender (1=男/2=女)         :")
                OneTeacher.Gender = CInt(Console.ReadLine())
                FileNameWriter.Write(OneTeacher.Gender)

                Console.Write("Teacher's Age           :")
                OneTeacher.Age = CInt(Console.ReadLine())
                FileNameWriter.Write(OneTeacher.Age)

                Console.Write("Teacher's Name          :")
                OneTeacher.Name = Console.ReadLine() ' 去掉CInt,直接存字符串
                FileNameWriter.Write(OneTeacher.Name)

                Console.Write("Teacher's Subject          :")
                OneTeacher.Subject = Console.ReadLine() ' 去掉CInt
                FileNameWriter.Write(OneTeacher.Subject)

                Console.Write("Teacher Password (Max 12)          :")
                OneTeacher.Password = Console.ReadLine() ' 去掉CInt
                FileNameWriter.Write(OneTeacher.Password)
            End Using ' 自动关闭BinaryWriter
        End Using ' 自动关闭FileStream

        Console.WriteLine("Teacher details have been saved!")
        Console.Write("Do you want to add a new teacher? (Y/N): ")
        Answer = Console.ReadLine().Trim().ToUpper()
    Loop While Answer = "Y" ' 循环直到用户输入N
End Sub

额外提醒

  • 我把FileMode.Create改成了FileMode.Append,因为Create每次都会清空文件重新创建,你原来的代码每次添加新教师都会覆盖之前的所有数据,这应该不是你想要的吧?如果确实要覆盖,再改回去就行。
  • 别忘了实例化Teacher对象(Dim OneTeacher As New Teacher),你原来的代码里没写,运行时会报错“对象引用未设置到对象的实例”。

备注:内容来源于stack exchange,提问作者MarioCoder911

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:08:07