我有以下基本代码从StreamReader读取文本文件:
Using sr As New StreamReader(FileData)
Dim line As String = String.Empty
Do
'Error occurs on the next line after looping
'past the *last* line in the file...sometimes
line = sr.ReadLine()
'Some code here to parse and process the line
Loop Until (line Is Nothing) OrElse (line = String.Empty)
End Using
Run Code Online (Sandbox Code Playgroud)
我尝试将Do循环更改为Do While Not sr.EndOfStream我尝试检查If sr.ReadLine IsNot Nothing和其他一些东西,但我不断获取无法访问已处置的对象.对象名称:成功读取和处理所有105行后出现'SslStream'错误.此代码已经工作了几年,但是某些文件(最近)似乎存在一些导致此问题的问题.
我打开文件,没有看到任何与众不同的东西.没有额外的空白行,有趣的人物或任何类似的东西.只是一个普通的文件,105行格式正确.所以即使知道这个文件有一些导致错误,我需要以编程方式处理这个问题.
我该怎么做才能防止sr.ReadLine()代码行抛出我尚未尝试过的异常?
更新在读取文件的最后一行时,StreamReader上的'EndOfStream'属性不可避免地变为:EndOfStream:{"无法访问已处置的对象.对象名称:'SslStream'."}它永远不会切换为"True".这使得检查这种情况有问题.
我想我已经弄清楚为什么这个问题有时只会发生:如果我在最后添加一个空行到文件,这一切都不会发生.仅当文件的最后一行包含数据时.不过,我应该能够以编程方式处理这个问题.告诉提供文件的供应商总是在最后添加一个空行应该不是解决方案.
最后 - 我弄清楚了这一点.我的OP的一些评论开始让我从不同的角度来看待这个问题.所述底层的流被自动关闭.我开始将焦点转移到Stream对象加载到StreamReader而不是StreamReader本身.
结果是流是罪魁祸首.stream对象有一个.CanRead属性,该属性为'True',直到读到文件的最后一行时变为'False'.这导致StreamReader.EndOfStream值在文件中没有空行时成为异常.
检查加载到StreamReader中的基础Stream上的.CanRead值并确保它不是False是解决方案.新的循环在下面,我确保使用短路'OrElse'或后一个条件会像以前一样抛出异常.
Using sr As New StreamReader(FileData)
Dim line As String = String.Empty
Do
line = sr.ReadLine()
'Some code here to parse and process the line
Loop Until (Not FileData.CanRead) OrElse (sr.EndOfStream)
End Using
Run Code Online (Sandbox Code Playgroud)