VB6Parse / Library / File / seek

VB6 Library Reference

Seek Function

Returns a Long specifying the current read/write position within a file opened using Open statement.

Syntax

Seek(filenumber)

Parameters

Return Value

Returns a Long value indicating the current position in the file: - For Random mode files: Returns the record number of the next record to be read or written (1-based) - For Binary, Output, Append, and Input mode files: Returns the byte position where the next operation occurs (1-based) - Position 1 is the beginning of the file

Remarks

The Seek function is used to determine the current position in a file opened with the Open statement. It is particularly useful for: - Determining current position before reading/writing - Saving position to return to later - Calculating file progress (current position vs file size using LOF) - Implementing custom file navigation - Verifying position after Seek statement

For Random access files, Seek returns the record number (1-based) of the next record to be read or written. For all other access modes (Binary, Input, Output, Append), Seek returns the byte position (1-based).

The Seek function is different from the Seek statement: - Seek function: Returns current position (read-only operation) - Seek statement: Sets the position for next read/write (write operation)

The file must be open before calling Seek. Use FreeFile to get an available file number. Always close files when done using Close statement.

Typical Uses

  1. Current Position: Determine where you are in the file
  2. Save Position: Store current position to return to later
  3. Progress Tracking: Calculate percentage of file processed
  4. Navigation: Implement forward/backward navigation in files
  5. Record Counting: Count records processed in Random access
  6. Byte Counting: Track bytes read/written in Binary mode
  7. Position Verification: Verify Seek statement worked correctly
  8. File Parsing: Parse structured binary files with position tracking

Basic Examples

' Example 1: Get current position in binary file
Dim FileNum As Integer
Dim CurrentPos As Long
FileNum = FreeFile
Open "data.bin" For Binary As #FileNum
CurrentPos = Seek(FileNum)  ' Returns 1 at start
Debug.Print "Position: " & CurrentPos
Close #FileNum
' Example 2: Get current record number in random access
Dim FileNum As Integer
Dim RecordNum As Long
FileNum = FreeFile
Open "records.dat" For Random As #FileNum Len = 100
RecordNum = Seek(FileNum)  ' Returns next record number
Debug.Print "Next Record: " & RecordNum
Close #FileNum
' Example 3: Save and restore position
Dim FileNum As Integer
Dim SavedPos As Long
FileNum = FreeFile
Open "data.txt" For Input As #FileNum
' Read some data...
SavedPos = Seek(FileNum)  ' Save position
' Read more data...
Seek #FileNum, SavedPos   ' Restore position
Close #FileNum
' Example 4: Calculate progress percentage
Dim FileNum As Integer
Dim Progress As Double
FileNum = FreeFile
Open "large.dat" For Binary As #FileNum
Progress = (Seek(FileNum) / LOF(FileNum)) * 100
Debug.Print "Progress: " & Format(Progress, "0.0") & "%"
Close #FileNum

Common Patterns

Pattern 1: GetCurrentPosition

Get current file position with error handling

Function GetCurrentPosition(FileNum As Integer) As Long
On Error Resume Next
GetCurrentPosition = Seek(FileNum)
If Err.Number <> 0 Then
GetCurrentPosition = -1  ' Error indicator
End If
End Function

Pattern 2: GetProgressPercentage

Calculate how much of file has been processed

Function GetProgressPercentage(FileNum As Integer) As Double
Dim CurrentPos As Long
Dim FileSize As Long

CurrentPos = Seek(FileNum)
FileSize = LOF(FileNum)

If FileSize > 0 Then
GetProgressPercentage = (CurrentPos / FileSize) * 100
Else
GetProgressPercentage = 0
End If
End Function

Pattern 3: IsAtEndOfFile

Check if at end of file using position

Function IsAtEndOfFile(FileNum As Integer) As Boolean
IsAtEndOfFile = (Seek(FileNum) > LOF(FileNum))
End Function

Pattern 4: GetRemainingBytes

Calculate bytes remaining in file

Function GetRemainingBytes(FileNum As Integer) As Long
GetRemainingBytes = LOF(FileNum) - Seek(FileNum) + 1
End Function

Pattern 5: SaveAndRestorePosition

Save position, perform operation, restore

Sub SaveAndRestorePosition(FileNum As Integer)
Dim SavedPos As Long
SavedPos = Seek(FileNum)

' Perform operations that change position
Seek #FileNum, 1  ' Go to start
' Read header...

Seek #FileNum, SavedPos  ' Restore position
End Sub

Pattern 6: GetCurrentRecordNumber

Get current record in Random access file

Function GetCurrentRecordNumber(FileNum As Integer) As Long
' For Random access, Seek returns record number
GetCurrentRecordNumber = Seek(FileNum)
End Function

Pattern 7: CalculateBytesProcessed

Track bytes processed since start

Function CalculateBytesProcessed(FileNum As Integer, StartPos As Long) As Long
CalculateBytesProcessed = Seek(FileNum) - StartPos
End Function

Pattern 8: ValidateFilePosition

Verify position is within file bounds

Function ValidateFilePosition(FileNum As Integer) As Boolean
Dim CurrentPos As Long
Dim FileSize As Long

CurrentPos = Seek(FileNum)
FileSize = LOF(FileNum)

ValidateFilePosition = (CurrentPos >= 1 And CurrentPos <= FileSize + 1)
End Function

Pattern 9: GetPositionInfo

Get detailed position information

Sub GetPositionInfo(FileNum As Integer, ByRef Position As Long, _
ByRef Size As Long, ByRef Remaining As Long)
Position = Seek(FileNum)
Size = LOF(FileNum)
Remaining = Size - Position + 1
End Sub

Pattern 10: SeekToPercentage

Jump to percentage of file

Sub SeekToPercentage(FileNum As Integer, Percentage As Double)
Dim TargetPos As Long
TargetPos = CLng((LOF(FileNum) * Percentage) / 100)
If TargetPos < 1 Then TargetPos = 1
Seek #FileNum, TargetPos
Debug.Print "Moved to position: " & Seek(FileNum)
End Sub

Advanced Usage

Example 1: FilePositionTracker Class

Track and manage file positions with bookmarks

' Class: FilePositionTracker
Private m_FileNum As Integer
Private m_Bookmarks As Collection

Private Sub Class_Initialize()
Set m_Bookmarks = New Collection
End Sub

Public Sub Initialize(FileNum As Integer)
m_FileNum = FileNum
End Sub

Public Function GetCurrentPosition() As Long
GetCurrentPosition = Seek(m_FileNum)
End Function

Public Sub AddBookmark(BookmarkName As String)
Dim CurrentPos As Long
CurrentPos = Seek(m_FileNum)

On Error Resume Next
m_Bookmarks.Remove BookmarkName
On Error GoTo 0

m_Bookmarks.Add CurrentPos, BookmarkName
End Sub

Public Sub GoToBookmark(BookmarkName As String)
Dim BookmarkPos As Long
On Error Resume Next
BookmarkPos = m_Bookmarks(BookmarkName)
If Err.Number = 0 Then
Seek #m_FileNum, BookmarkPos
Else
Err.Raise vbObjectError + 1001, "FilePositionTracker", _
"Bookmark not found: " & BookmarkName
End If
End Sub

Public Function GetProgress() As Double
Dim CurrentPos As Long
Dim FileSize As Long

CurrentPos = Seek(m_FileNum)
FileSize = LOF(m_FileNum)

If FileSize > 0 Then
GetProgress = (CDbl(CurrentPos) / CDbl(FileSize)) * 100
Else
GetProgress = 0
End If
End Function

Public Function GetRemainingBytes() As Long
GetRemainingBytes = LOF(m_FileNum) - Seek(m_FileNum) + 1
End Function

Public Sub ClearBookmarks()
Set m_Bookmarks = New Collection
End Sub

Example 2: BinaryFileParser Module

Parse structured binary files with position tracking

' Module: BinaryFileParser
Private Type FileHeader
Signature As String * 4
Version As Integer
RecordCount As Long
End Type

Public Function ParseFile(FileName As String) As Collection
Dim FileNum As Integer
Dim Header As FileHeader
Dim Records As New Collection
Dim i As Long
Dim StartPos As Long

FileNum = FreeFile
Open FileName For Binary As #FileNum

' Read header
StartPos = Seek(FileNum)
Debug.Print "Reading header at position: " & StartPos
Get #FileNum, , Header

Debug.Print "Header read, now at position: " & Seek(FileNum)

' Validate signature
If Header.Signature <> "DATA" Then
Close #FileNum
Err.Raise vbObjectError + 1001, "ParseFile", "Invalid file signature"
End If

' Read records
For i = 1 To Header.RecordCount
Dim RecordPos As Long
Dim RecordData As String

RecordPos = Seek(FileNum)
Debug.Print "Reading record " & i & " at position: " & RecordPos

' Read record (example: 100 byte records)
RecordData = Space$(100)
Get #FileNum, , RecordData
Records.Add RecordData
Next i

Debug.Print "Finished at position: " & Seek(FileNum)
Debug.Print "File size: " & LOF(FileNum)

Close #FileNum
Set ParseFile = Records
End Function

Public Function GetFileProgress(FileNum As Integer) As String
Dim CurrentPos As Long
Dim FileSize As Long
Dim Percentage As Double

CurrentPos = Seek(FileNum)
FileSize = LOF(FileNum)

If FileSize > 0 Then
Percentage = (CDbl(CurrentPos) / CDbl(FileSize)) * 100
Else
Percentage = 0
End If

GetFileProgress = "Position: " & CurrentPos & " of " & FileSize & _
" (" & Format(Percentage, "0.0") & "%)"
End Function

Example 3: RandomAccessNavigator Class

Navigate through Random access file records

' Class: RandomAccessNavigator
Private m_FileNum As Integer
Private m_RecordLength As Integer
Private m_TotalRecords As Long

Public Sub Initialize(FileName As String, RecordLength As Integer)
m_RecordLength = RecordLength
m_FileNum = FreeFile

Open FileName For Random As #m_FileNum Len = RecordLength
m_TotalRecords = LOF(m_FileNum) \ RecordLength
End Sub

Public Function GetCurrentRecord() As Long
' For Random access, Seek returns record number
GetCurrentRecord = Seek(m_FileNum)
End Function

Public Function GetTotalRecords() As Long
GetTotalRecords = m_TotalRecords
End Function

Public Function MoveNext() As Boolean
Dim CurrentRecord As Long
CurrentRecord = Seek(m_FileNum)

If CurrentRecord <= m_TotalRecords Then
' Seek statement will auto-advance after Get
MoveNext = True
Else
MoveNext = False
End If
End Function

Public Sub MovePrevious()
Dim CurrentRecord As Long
CurrentRecord = Seek(m_FileNum)

If CurrentRecord > 1 Then
Seek #m_FileNum, CurrentRecord - 1
End If
End Sub

Public Sub MoveFirst()
Seek #m_FileNum, 1
End Sub

Public Sub MoveLast()
Seek #m_FileNum, m_TotalRecords
End Sub

Public Function IsAtBeginning() As Boolean
IsAtBeginning = (Seek(m_FileNum) = 1)
End Function

Public Function IsAtEnd() As Boolean
IsAtEnd = (Seek(m_FileNum) > m_TotalRecords)
End Function

Public Function GetProgress() As Double
Dim CurrentRecord As Long
CurrentRecord = Seek(m_FileNum)

If m_TotalRecords > 0 Then
GetProgress = (CDbl(CurrentRecord - 1) / CDbl(m_TotalRecords)) * 100
Else
GetProgress = 0
End If
End Function

Public Sub Close()
Close #m_FileNum
End Sub

Example 4: FileProgressMonitor Class

Monitor file processing progress with time estimates

' Class: FileProgressMonitor
Private m_FileNum As Integer
Private m_StartPosition As Long
Private m_StartTime As Double
Private m_FileSize As Long

Public Sub StartMonitoring(FileNum As Integer)
m_FileNum = FileNum
m_StartPosition = Seek(FileNum)
m_StartTime = Timer
m_FileSize = LOF(FileNum)
End Sub

Public Function GetCurrentPosition() As Long
GetCurrentPosition = Seek(m_FileNum)
End Function

Public Function GetBytesProcessed() As Long
GetBytesProcessed = Seek(m_FileNum) - m_StartPosition
End Function

Public Function GetPercentComplete() As Double
Dim CurrentPos As Long
CurrentPos = Seek(m_FileNum)

If m_FileSize > 0 Then
GetPercentComplete = (CDbl(CurrentPos) / CDbl(m_FileSize)) * 100
Else
GetPercentComplete = 0
End If
End Function

Public Function GetElapsedSeconds() As Double
GetElapsedSeconds = Timer - m_StartTime
End Function

Public Function GetEstimatedTimeRemaining() As Double
Dim BytesProcessed As Long
Dim BytesRemaining As Long
Dim ElapsedTime As Double
Dim BytesPerSecond As Double

BytesProcessed = Seek(m_FileNum) - m_StartPosition
BytesRemaining = m_FileSize - Seek(m_FileNum) + 1
ElapsedTime = Timer - m_StartTime

If BytesProcessed > 0 And ElapsedTime > 0 Then
BytesPerSecond = BytesProcessed / ElapsedTime
GetEstimatedTimeRemaining = BytesRemaining / BytesPerSecond
Else
GetEstimatedTimeRemaining = 0
End If
End Function

Public Function GetProgressReport() As String
Dim Report As String
Dim PercentComplete As Double
Dim ElapsedTime As Double
Dim RemainingTime As Double

PercentComplete = GetPercentComplete()
ElapsedTime = GetElapsedSeconds()
RemainingTime = GetEstimatedTimeRemaining()

Report = "Progress: " & Format(PercentComplete, "0.0") & "%" & vbCrLf
Report = Report & "Position: " & Seek(m_FileNum) & " of " & m_FileSize & vbCrLf
Report = Report & "Elapsed: " & Format(ElapsedTime, "0.0") & "s" & vbCrLf
Report = Report & "Remaining: " & Format(RemainingTime, "0.0") & "s"

GetProgressReport = Report
End Function

Public Sub Reset()
m_StartPosition = Seek(m_FileNum)
m_StartTime = Timer
End Sub

Error Handling

The Seek function can generate the following errors:

Always use error handling when working with file I/O:

On Error Resume Next
CurrentPos = Seek(FileNum)
If Err.Number <> 0 Then
MsgBox "Error getting position: " & Err.Description
End If

Performance Considerations

Best Practices

  1. Validate File Number: Ensure file is open before calling Seek
  2. Use with LOF: Combine with LOF function to calculate progress
  3. Error Handling: Always use error handling for file operations
  4. Close Files: Always close files when done to free resources
  5. Save Position: Store position before operations that change it
  6. 1-Based Position: Remember positions start at 1, not 0
  7. Mode Awareness: Know whether function returns record# or byte position
  8. FreeFile Usage: Use FreeFile to get available file numbers
  9. Progress Updates: Update UI periodically, not on every byte
  10. Position Validation: Verify position is within expected range
Function/Statement Purpose Returns Mode-Specific
Seek (Function) Get current position Long (position) Record# or byte position
Seek (Statement) Set position N/A (void) Sets for next operation
LOF Get file size Long (bytes) Total file size
EOF Check end of file Boolean True if past end
Loc Get current position Long Similar to Seek
FileLen Get file length Long (bytes) File must be closed

Platform Considerations

Limitations

← Back to File | View all functions