在VB.NET中读取文件错误?

时间:2009-05-27 02:07:34

标签: 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

1 个答案:

答案 0 :(得分:2)

当您更改基础流的位置时,StreamReader不知道您已完成此操作。如果它之前读过“太多”数据(故意,为了提高效率 - 它试图避免对底层流进行大量的小读取)那么它将使用缓冲的数据,而不是直接与重新定位的对话流。重新定位流后,您需要调用StreamReader.DiscardBufferedData以避免这种情况。