StreamReader problem

I need to find out how to display the last 128 characters of a text document. I've tried using StreamReader to get the whole file but I only need the last 128 characters. Here is my code so far:

<VB.NET 2005>

Private Sub Button12_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click

If ListBox1.Text = "" Then

MessageBox.Show("No File Selected", "Error")

Exit Sub

End If

Dim sr As New System.IO.StreamReader(ListBox1.Text)

Dim WholeFile As String = sr.ReadToEnd()

Dim LastDigits As String = ""

Dim Index As Integer

If WholeFile.Length > 128 Then

For Index = WholeFile.Length - 128 To WholeFile.Length - 1

LastDigits = LastDigits & WholeFile(Index)

Next

MessageBox.Show(LastDigits, "Test")

End If

End Sub

</VB.NET 2005>

It doesn't display the data correctly, only the first few words and it doesn't display several blankspaces "   " as is in the file.

Can somebody please help... Thanks in advance.




Answer this question

StreamReader problem

  • Arindam Sinha

    You don't specify the exact file format, but something like the following should work for pure text files:

    Dim sr As New System.IO.StreamReader("YourFileNameHere")
    sr.BaseStream.Seek(-128, IO.SeekOrigin.End)
    Dim LastDigits As String = sr.ReadToEnd()

    '//mdb

     


  • Kevin Farley

    ID3 tags sometimes use C-style (ASCII 0-terminated) strings and are thus binary data -- you can't treat them as VB.NET strings without running into all kinds of issues.

    Something like the following should work:

            Dim sr As New System.IO.StreamReader("YourFile.mp3")
            Dim br As New System.IO.BinaryReader(sr.BaseStream)
            sr.BaseStream.Seek(-128, IO.SeekOrigin.End)
            Dim b() As Byte = br.ReadBytes(128)
            If GetString(b, 0, 3) <> "TAG" Then
                Throw New Exception("No ID3v1 tag found")
            End If

            Dim Title As String = GetString(b, 3, 30)
            Dim Artist As String = GetString(b, 33, 30)
            Dim Album As String = GetString(b, 63, 30)
            Dim Year As String = GetString(b, 93, 4)
            Dim Comment As String = GetString(b, 97, 30)
            Dim Genre As Byte = b(127)

    (don't forget to close sr and br)

        Private Function GetString(ByVal b() As Byte, ByVal StartOffset As Integer, ByVal MaxLen As Integer) As String
            Dim res As String = ""
            For i As Integer = StartOffset To StartOffset + MaxLen - 1
                If b(i) = 0 Then
                    Exit For
                Else
                    res &= Chr(CInt(b(i)))
                End If
            Next i
            Return res.Trim
        End Function

    '//mdb


  • Bob81

    mdb,
    Thanks for the help. That works like a dream. Cheers,



  • Maclau

    Thanks,

    It's an MP3 file and I want to retrieve the ID3v1 tag which is in the last 128 digits. This brings up the same string in a messagebox as my code. This is a lot shorter than my code though :)

    It only brings up "TAG{Title}" then nothing...

    Do I need to convert the string or something

    Thanks again,



  • StreamReader problem