如何解决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
相关产品推荐
相关产品推荐

