.net 使用StreamReader在文本文件中循环会导致;无法访问已处置的对象。”;

.net 使用StreamReader在文本文件中循环会导致;无法访问已处置的对象。”;,.net,vb.net,.net,Vb.net,我有以下从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

我有以下从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
我尝试将Do循环更改为
Do,而不是sr.EndOfStream
我尝试检查
sr.ReadLine是否为Nothing
以及其他一些事情,但我一直得到无法访问已处理的对象。对象名称:“SslStream”成功读取和处理所有105行后出错。这段代码已经运行了几年,但是(最近)某些文件似乎存在一些问题,导致了这个问题

我打开文件,没有看到任何异常。没有额外的空行,有趣的字符或类似的东西。只是一个普通的文件,有105行格式正确的行。所以,即使知道这个文件有什么导致错误的地方,我也需要以编程的方式处理它

如何防止
sr.ReadLine()
代码行抛出我尚未尝试的异常

更新读取文件的最后一行时,StreamReader上的“EndOfStream”属性立即转到:EndOfStream:{”无法访问已释放的对象。 对象名称:“SslStream.”}它从不切换为“True”。这使得检查这种情况成为问题


我想我已经弄明白了为什么这个问题只会偶尔出现:如果我在文件末尾添加了一个空行,那么这些都不会发生。只有当文件的最后一行包含数据时,才会出现这种情况。不过,我应该能够通过编程来处理这个问题。告诉提供文件的供应商始终在末尾添加一个空行不应该是解决方案。

编辑:根据新信息,我认为以下是您的解决方案。 您必须在Do While循环之外声明字符串对象。 在初始化过程中,首次使用sr.ReadLine填充。 我想剩下的应该是不言自明的

Do While (Not line Is Nothing)
    ' Display to console.
    Console.WriteLine(line)
    ' Read in the next line.
    line = sr.ReadLine
Loop

编辑:根据新信息,我认为以下是您的解决方案。 您必须在Do While循环之外声明字符串对象。 在初始化过程中,首次使用sr.ReadLine填充。 我想剩下的应该是不言自明的

Do While (Not line Is Nothing)
    ' Display to console.
    Console.WriteLine(line)
    ' Read in the next line.
    line = sr.ReadLine
Loop

最后,我弄明白了。我的专栏文章中的一些评论让我从不同的角度看待这个问题。基础流正在自动关闭。我开始将焦点转移到正在加载到StreamReader中的对象,而不是StreamReader本身

原来那条小溪就是罪魁祸首。流对象的.CanRead属性为“True”,直到读取文件的最后一行时变为“False”。当文件中没有空行时,这导致StreamReader.EndOfStream值异常

检查加载到StreamReader中的底层流的.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

最后,我弄明白了。我的专栏文章中的一些评论让我从不同的角度看待这个问题。基础流正在自动关闭。我开始将焦点转移到正在加载到StreamReader中的对象,而不是StreamReader本身

原来那条小溪就是罪魁祸首。流对象的.CanRead属性为“True”,直到读取文件的最后一行时变为“False”。当文件中没有空行时,这导致StreamReader.EndOfStream值异常

检查加载到StreamReader中的底层流的.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

你的循环中没有任何可以结束循环的东西。您的
而不是sr.EndOfStream
肯定会出现!除此之外,您发布的代码中没有任何内容会导致您描述的问题-那么您的示例中缺少了哪些其他代码?是的,对不起-试图简化代码,但遗漏了一些代码!“空行”上是否有换行符?此外,例外情况提到sslStream。这是哪种类型的对象?因为我们看不到这个代码。在完成读取之前,您是否在某个地方关闭了流?“SslStream”听起来不像是一个文件。它确实是一个文本文件,通过从安全FTP服务器下载的FtpWebRequest加载到流对象中。您的循环中没有任何可以结束循环的内容。您的
而不是sr.EndOfStream
肯定会出现!除此之外,您发布的代码中没有任何内容会导致您描述的问题-那么您的示例中缺少了哪些其他代码?是的,对不起-试图简化代码,但遗漏了一些代码!“空行”上是否有换行符?此外,例外情况提到sslStream。这是哪种类型的对象?因为我们看不到这个代码。在完成读取之前,您是否正在关闭流?“SslStream”听起来不太像文件。它确实是一个文本文件,通过从安全FTP服务器下载的FtpWebRequest加载到流对象中。这也不起作用,它为我正在读取的文件提供了相同的错误。请查看编辑后的答案。通过在Do-while部分使用while子句,您就不会有在最后一行运行代码的错误,这没什么。谢谢,但这也不起作用。检查我的更新部分。在调试期间,我可以看到EndOfStream属性在该loo的最后一次迭代时自动切换到该异常值