Seek locates a position in a file. It allows data to be read from a binary file at a certain part. For example, we can read 20,000 bytes from any part of a file. This is useful for certain file formats—particularly binary ones.
Example. To begin our tutorial, we use the Seek method. From databases, you know that Seek is the term for when the data can be instantly retrieved, with an index. Therefore, Seek should be fast.
Here:
This example gets the 50000th byte to the 51999th byte and iterates through them.
Note:
The BinaryReader class is used. The program opens the binary file with BinaryReader here. It uses the “perls.bin” file.
File.Open
C# program that seeks in Main method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.IO; class Program { static void Main() { // 1. // Open as binary file. using (BinaryReader b = new BinaryReader(File.Open("perls.bin", FileMode.Open))) { // 2. // Important variables: int length = (int)b.BaseStream.Length; int pos = 50000; int required = 2000; int count = 0; // 3. // Seek the required index. b.BaseStream.Seek(pos, SeekOrigin.Begin); // 4. // Slow loop through the bytes. while (pos < length && count < required) { byte y = b.ReadByte(); // 5. // Increment the variables. pos++; count++; } } } } |
Variables used in program. Length is the entire length of the file we are reading from. Pos is the index we want to start reading from. Required is the number of bytes we want to read. Count is the number of bytes we have read.
Seek:
We call Seek on the BaseStream and move the position to 50000 bytes. It looks through each byte.
The above code can slow down IO. It apparently requires each byte to be read separately off the disk. By using arrays, we can improve performance by several times. Next, we look at the version that uses arrays.