2009-05-27 55 views
0

这个文件的工作方式是有一个空缓冲区,然后用户检查和然后一个字节,给你的用户名字母数,然后一个字节多少字节跳到下一个用户和一个字节为哪个用户文件用户保留其设置。在VB.NET中读取文件错误?

IF语句中usersm变量的循环设置整个文件流进行提取。然而,在几乎完全相同的代码中,else子句特别是else代码中的str.Read(xnl,0,usn-1)似乎正在读取文件的最开始部分,尽管文件流的位置被设置得更早,但任何人都知道这里发生了什么事?

这是VB2005

Private Sub readusersdata(ByVal userdatafile As String) 
    ListView1.BeginUpdate() 
    ListView1.Items.Clear() 
    Using snxl As IO.Stream = IO.File.Open(userdatafile, IO.FileMode.Open) 

     Using str As New IO.StreamReader(snxl) 
      str.BaseStream.Position = 4 
      Dim usersm As Integer = str.BaseStream.ReadByte() 
      Dim users As Integer = usersm 
      While users > 0 
       If usersm = users Then 
        Dim trailtouser As Integer = 0 
        str.BaseStream.Position = 6 
        Dim ust As Integer = str.BaseStream.ReadByte() 
        str.BaseStream.Position = 8 
        Dim snb(ust - 1) As Char 
        str.ReadBlock(snb, 0, ust) 
        Dim bst = New String(snb) 
        If usersm = 1 Then 
         str.BaseStream.Position = 16 
        Else 
         str.BaseStream.Position = 15 
        End If 
        cLVN(ListView1, bst, str.BaseStream.ReadByte) 
        str.BaseStream.Position = 8 + snb.Length 
        str.BaseStream.Position += str.BaseStream.ReadByte + 1 
       Else 

        Dim usn As Integer = str.BaseStream.ReadByte 
        str.BaseStream.Position += 2 
        Dim chrpos As Integer = str.BaseStream.Position 
        Dim xnl(usn - 1) As Char 
        str.Read(xnl, 0, usn - 1) 
        Dim skpbyte As Integer = str.BaseStream.ReadByte 
        str.BaseStream.Position += 3 
        Dim udata As Integer = str.BaseStream.ReadByte 


       End If 

       users -= 1 

      End While 
     End Using 
    End Using 
    ListView1.EndUpdate() 
End Sub 

回答

2

当您更改底层流的位置,StreamReader不知道你这样做。如果之前读取的数据太多(故意为了提高效率 - 它会尽量避免在底层数据流上做很多小的读取操作),那么它将使用缓冲的数据,而不是直接与重新定位的数据进行对话流。重新定位流后,您需要拨打StreamReader.DiscardBufferedData以避免这种情况。

+0

它的asinine,如果你操纵streamreader下的流,它不跟上变化,这个作品谢谢你 – Jim 2009-05-27 09:13:52