Reading a File Line-by-line or Blockwise with a Progress Indicator
Reading a text file line-by-line:
Imports System.IO
⋮
Dim Reader As New StreamReader("C:\WINDOWS\WIN.INI")
Dim Line As String = Reader.ReadLine()
Do Until Line Is Nothing
Debug.WriteLine(Line)
Line = Reader.ReadLine()
Loop
Reader.Close()
— or —
Imports System.IO
⋮
Dim Reader As New StreamReader("C:\WINDOWS\WIN.INI")
Do While Reader.Peek > -1
Debug.WriteLine(Reader.ReadLine())
Loop
Reader.Close()
Reading a file blockwise with progressbar:
Imports System.IO
Imports System.Text
⋮
Dim Reader As New BinaryReader( _
New FileStream("C:\WINDOWS\WIN.INI", FileMode.Open) _
)
Dim Buffer() As Byte
Me.ProgressBar1.Minimum = 0
Me.ProgressBar1.Maximum = Reader.BaseStream.Length
Dim BytesRead As Long
Const BlockSize As Integer = 1024 ' Read blocks of 1,024 bytes.
Do While BytesRead < Reader.BaseStream.Length
Buffer = Reader.ReadBytes(BlockSize)
Debug.Write(Encoding.Default.GetString(Buffer))
BytesRead = BytesRead + Buffer.Length
Me.ProgressBar1.Value = BytesRead
Loop
Reader.Close()
Reading a binary file:
Imports System
Imports System.IO
Imports System.Text
''' <summary>
''' Extends the <c>System.IO.BinaryReader</c> class by a <c>ReadToEnd</c>
''' method that can be used to read a whole file.
''' </summary>
Public Class ExtendedBinaryReader
Inherits BinaryReader
''' <summary>
''' Creates a new instance of the <c>ExtendedBinaryReader</c> class.
''' </summary>
''' <param name="Input">A stream.</param>
Public Sub New(ByVal Input As Stream)
MyBase.New(Input)
End Sub
''' <summary>
''' Creates a new instance of the <c>ExtendedBinaryReader</c> class.
''' </summary>
''' <param name="Input">The provided stream.</param>
''' <param name="Encoding">The character encoding.</param>
Public Sub New(ByVal Input As Stream, ByVal Encoding As Encoding)
MyBase.New(Input, Encoding)
End Sub
''' <summary>
''' Reads the whole data in the base stream and returns it in an
''' array of bytes.
''' </summary>
''' <returns>The streams whole binary data.</returns>
Public Function ReadToEnd() As Byte()
Return ReadToEnd(Short.MaxValue)
End Function
''' <summary>
''' Reads the whole data in the base stream and returns it in an
''' array of bytes.
''' </summary>
''' <param name="InitialLength">The initial buffer length.</param>
''' <returns>The stream's whole binary data.</returns>
' Based on an implementation by Jon Skeet [MVP]
' (<URL:https://jonskeet.uk/csharp/readbinary.html>).
Public Function ReadToEnd(ByVal InitialLength As Integer) As Byte()
' If an unhelpful initial length was passed, just use 32K.
If InitialLength < 1 Then
InitialLength = Short.MaxValue
End If
Dim Buffer(InitialLength - 1) As Byte
Dim Read As Integer
Dim Chunk As Integer = _
Me.BaseStream.Read(Buffer, Read, Buffer.Length - Read)
Do While Chunk > 0
Read = Read + Chunk
' If the end of the buffer is reached, check to see if there is
' any more data.
If Read = Buffer.Length Then
Dim NextByte As Integer = Me.BaseStream.ReadByte()
' If the end of the stream is reached, we are done.
If NextByte = -1 Then
Return Buffer
End If
' Nope. Resize the buffer, put in the byte we have just
' read, and continue.
Dim NewBuffer(Buffer.Length * 2 - 1) As Byte
Buffer.BlockCopy( _
Buffer, _
0, _
NewBuffer, _
0, _
Buffer.Length _
)
'Array.Copy(Buffer, NewBuffer, Buffer.Length)
NewBuffer(Read) = CByte(NextByte)
Buffer = NewBuffer
Read = Read + 1
End If
Chunk = Me.BaseStream.Read(Buffer, Read, Buffer.Length - Read)
Loop
' The buffer is now too big. Shrink it.
Dim ReturnBuffer(Read - 1) As Byte
Buffer.BlockCopy(Buffer, 0, ReturnBuffer, 0, Read)
'Array.Copy(Buffer, ReturnBuffer, Read)
Return ReturnBuffer
End Function
End Class
Usage:
Dim Reader As New ExtendedBinaryReader( _
New FileStream("C:\WINDOWS\WIN.INI", FileMode.Open) _
)
MsgBox(Encoding.Default.GetString(Reader.ReadToEnd()))
Reader.Close()