2009-05-27 9 views
0

Die Art, wie diese Datei funktioniert, ist ein Null-Puffer, dann eine Benutzerprüfsumme, dann ein Byte, das Ihnen die Anzahl der Benutzernamen gibt, dann ein Byte für wie viele Bytes zum nächsten Benutzer und ein Byte für welchen Benutzer Datei, in der der Benutzer seine Einstellungen behält.Lesen eines Dateifehlers in VB.NET?

Die Schleife mit der Variablen usersm in der IF-Anweisung richtet den gesamten Dateistream für die Extraktion ein. Aber mit fast genau dem gleichen Code scheint die else-Klausel speziell str.Read (xnl, 0, usn - 1) im else-Code den Anfang der Datei zu lesen, obwohl die Position des Filestreams früher gesetzt wurde Was passiert hier?

dies in VB2005 ist

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 

Antwort

2

Wenn Sie die Position des zugrunde liegenden Stream ändern, wird die StreamReader nicht wissen, dass Sie das getan haben. Wenn es zuvor "zu viele" Daten gelesen hat (absichtlich, aus Gründen der Effizienz - es versucht zu vermeiden, viele kleine Reads auf dem zugrunde liegenden Stream zu tun), dann wird es gepufferte Daten haben, die es verwenden wird, anstatt direkt zu repositionieren Strom. Sie müssen StreamReader.DiscardBufferedData aufrufen, nachdem Sie den Stream neu positioniert haben, um dies zu vermeiden.

+0

Sein asinine, dass, wenn Sie den Stream unter dem streamreader manipulieren, dass es nicht mit den Änderungen Schritt hält, funktioniert das Dankeschön – Jim

+0

Warum ist es asinine? Wie würde der StreamReader wissen? In 99% der Fälle * verwirren * Sie sich nicht mit dem zugrunde liegenden Stream und die Pufferung ist sehr hilfreich. Denken Sie auch daran, dass nicht alle Streams sogar die Suche nach der aktuellen Position unterstützen, was die Erkennung noch schwieriger machen würde. –

+0

Sie würden denken, dass, wenn der interne Zeiger in einem Stream geändert wird, den der streamreader als Ressource verwendet, dass es seinen eigenen Zeiger aktualisieren würde. Das war etwas, von dem ich nicht dachte, dass ich mir Sorgen machen musste. In diesem Programm muss ich ein wenig herumspringen, um die Daten zu erhalten, die ich sowohl in Bytes als auch in Strings benötige. – Jim