这个文件的工作方式是有一个空缓冲区,然后是用户检查总和,然后是一个字节,它给你用户名字母计数,然后是一个字节,用于跳转到下一个用户的字节数和一个字节用户文件,用户保持其设置。
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
答案 0 :(得分:2)
当您更改基础流的位置时,StreamReader
不知道您已完成此操作。如果它之前读过“太多”数据(故意,为了提高效率 - 它试图避免对底层流进行大量的小读取)那么它将使用缓冲的数据,而不是直接与重新定位的对话流。重新定位流后,您需要调用StreamReader.DiscardBufferedData
以避免这种情况。