VB6Parse / Library / File / lof

VB6 Library Reference

LOF Function

Returns a Long representing the size, in bytes, of a file opened using the Open statement.

Syntax

LOF(filenumber)

Parameters

Return Value

Returns a Long: - Size of the file in bytes - For files opened in any mode (Binary, Random, Input, Output, Append) - Returns 0 for empty files - Maximum value 2,147,483,647 (Long type limit ~2GB) - Returns actual file size on disk - Updated immediately if file grows during operation

Remarks

The LOF function returns the length (size) of an open file:

Typical Uses

  1. Get File Size
fileSize = LOF(1)
  1. Calculate Record Count
recordCount = LOF(fileNum) / Len(record)
  1. Read Entire File
buffer = String(LOF(fileNum), 0)
Get #fileNum, , buffer
  1. Progress Calculation
percent = (Loc(fileNum) / LOF(fileNum)) * 100
  1. Check Empty File
If LOF(fileNum) = 0 Then
MsgBox "File is empty"
End If
  1. Loop Until End
Do While Loc(fileNum) < LOF(fileNum)
Get #fileNum, , data
Loop
  1. Display File Size
lblSize.Caption = "Size: " & LOF(fileNum) & " bytes"
  1. Allocate Byte Array
ReDim fileData(1 To LOF(fileNum)) As Byte

Basic Examples

Example 1: Get File Size

Dim fileNum As Integer
Dim fileSize As Long

fileNum = FreeFile
Open "data.bin" For Binary As #fileNum

fileSize = LOF(fileNum)
MsgBox "File size: " & fileSize & " bytes"

Close #fileNum

Example 2: Calculate Record Count

Type CustomerRecord
ID As Long
Name As String * 50
Balance As Currency
End Type

Dim customer As CustomerRecord
Dim fileNum As Integer
Dim totalRecords As Long

fileNum = FreeFile
Open "customers.dat" For Random As #fileNum Len = Len(customer)

totalRecords = LOF(fileNum) / Len(customer)
MsgBox "Total customers: " & totalRecords

Close #fileNum

Example 3: Read Entire File

Dim fileNum As Integer
Dim fileContents As String
Dim fileSize As Long

fileNum = FreeFile
Open "readme.txt" For Binary As #fileNum

fileSize = LOF(fileNum)
fileContents = String(fileSize, 0)
Get #fileNum, , fileContents

Close #fileNum

MsgBox fileContents

Example 4: Progress Indicator

Dim fileNum As Integer
Dim data As Byte
Dim fileSize As Long
Dim bytesRead As Long

fileNum = FreeFile
Open "large.dat" For Binary As #fileNum
fileSize = LOF(fileNum)

Do While Loc(fileNum) < fileSize
Get #fileNum, , data
ProcessByte data

bytesRead = Loc(fileNum)
If bytesRead Mod 1024 = 0 Then
lblProgress.Caption = Format((bytesRead / fileSize) * 100, "0.0") & "%"
DoEvents
End If
Loop

Close #fileNum

Common Patterns

Pattern 1: GetFileSize

Function GetFileSize(ByVal fileNum As Integer) As Long
On Error Resume Next
GetFileSize = LOF(fileNum)
If Err.Number <> 0 Then
GetFileSize = -1
Err.Clear
End If
End Function

Pattern 2: CalculateRecordCount

Function CalculateRecordCount(ByVal fileNum As Integer, _
ByVal recordLength As Long) As Long
Dim fileSize As Long
fileSize = LOF(fileNum)

If recordLength > 0 Then
CalculateRecordCount = fileSize \ recordLength
Else
CalculateRecordCount = 0
End If
End Function

Pattern 3: ReadEntireFile

Function ReadEntireFile(ByVal fileNum As Integer) As String
Dim fileSize As Long
Dim buffer As String

fileSize = LOF(fileNum)
If fileSize > 0 Then
buffer = String(fileSize, 0)
Get #fileNum, 1, buffer
ReadEntireFile = buffer
Else
ReadEntireFile = ""
End If
End Function

Pattern 4: ReadEntireFileAsBytes

Function ReadEntireFileAsBytes(ByVal fileNum As Integer) As Byte()
Dim fileSize As Long
Dim buffer() As Byte

fileSize = LOF(fileNum)
If fileSize > 0 Then
ReDim buffer(0 To fileSize - 1) As Byte
Get #fileNum, 1, buffer
ReadEntireFileAsBytes = buffer
End If
End Function

Pattern 5: CalculateProgress

Function CalculateProgress(ByVal fileNum As Integer) As Single
Dim currentPos As Long
Dim totalSize As Long

currentPos = Loc(fileNum)
totalSize = LOF(fileNum)

If totalSize > 0 Then
CalculateProgress = (currentPos / totalSize) * 100
Else
CalculateProgress = 0
End If
End Function

Pattern 6: IsEmptyFile

Function IsEmptyFile(ByVal fileNum As Integer) As Boolean
IsEmptyFile = (LOF(fileNum) = 0)
End Function

Pattern 7: GetBytesRemaining

Function GetBytesRemaining(ByVal fileNum As Integer) As Long
GetBytesRemaining = LOF(fileNum) - Loc(fileNum)
End Function

Pattern 8: FormatFileSize

Function FormatFileSize(ByVal fileNum As Integer) As String
Dim bytes As Long
bytes = LOF(fileNum)

If bytes < 1024 Then
FormatFileSize = bytes & " bytes"
ElseIf bytes < 1048576 Then
FormatFileSize = Format(bytes / 1024, "0.0") & " KB"
Else
FormatFileSize = Format(bytes / 1048576, "0.0") & " MB"
End If
End Function

Pattern 9: IsAtEndOfFile

Function IsAtEndOfFile(ByVal fileNum As Integer) As Boolean
IsAtEndOfFile = (Loc(fileNum) >= LOF(fileNum))
End Function

Pattern 10: AllocateBuffer

Function AllocateBuffer(ByVal fileNum As Integer) As String
Dim size As Long
size = LOF(fileNum)

If size > 0 Then
AllocateBuffer = String(size, 0)
Else
AllocateBuffer = ""
End If
End Function

Advanced Examples

Example 1: File Reader Class

' Class: FileReader
Private m_fileNum As Integer
Private m_filename As String
Private m_fileSize As Long
Private m_isOpen As Boolean

Public Sub OpenFile(ByVal filename As String)
If m_isOpen Then CloseFile

m_filename = filename
m_fileNum = FreeFile
Open filename For Binary As #m_fileNum
m_fileSize = LOF(m_fileNum)
m_isOpen = True
End Sub

Public Property Get Size() As Long
If m_isOpen Then
Size = m_fileSize
Else
Size = 0
End If
End Property

Public Property Get Position() As Long
If m_isOpen Then
Position = Loc(m_fileNum)
Else
Position = 0
End If
End Property

Public Property Get Progress() As Single
If m_isOpen And m_fileSize > 0 Then
Progress = (Loc(m_fileNum) / m_fileSize) * 100
Else
Progress = 0
End If
End Property

Public Property Get IsEOF() As Boolean
If m_isOpen Then
IsEOF = (Loc(m_fileNum) >= m_fileSize)
Else
IsEOF = True
End If
End Property

Public Property Get IsEmpty() As Boolean
IsEmpty = (m_fileSize = 0)
End Property

Public Function ReadAll() As String
If m_isOpen And m_fileSize > 0 Then
ReadAll = String(m_fileSize, 0)
Get #m_fileNum, 1, ReadAll
Else
ReadAll = ""
End If
End Function

Public Sub CloseFile()
If m_isOpen Then
Close #m_fileNum
m_isOpen = False
m_fileSize = 0
End If
End Sub

Private Sub Class_Terminate()
CloseFile
End Sub

Example 2: Random File Manager

' Class: RandomFileManager
Private m_fileNum As Integer
Private m_recordLength As Long
Private m_totalRecords As Long
Private m_isOpen As Boolean

Public Sub OpenFile(ByVal filename As String, _
ByVal recordLength As Long)
If m_isOpen Then CloseFile

m_recordLength = recordLength
m_fileNum = FreeFile
Open filename For Random As #m_fileNum Len = recordLength

m_totalRecords = LOF(m_fileNum) \ recordLength
m_isOpen = True
End Sub

Public Property Get RecordCount() As Long
If m_isOpen Then
RecordCount = m_totalRecords
Else
RecordCount = 0
End If
End Property

Public Property Get FileSize() As Long
If m_isOpen Then
FileSize = LOF(m_fileNum)
Else
FileSize = 0
End If
End Property

Public Property Get CurrentRecord() As Long
If m_isOpen Then
CurrentRecord = Loc(m_fileNum)
Else
CurrentRecord = 0
End If
End Property

Public Function IsValidRecord(ByVal recordNum As Long) As Boolean
IsValidRecord = (recordNum >= 1 And recordNum <= m_totalRecords)
End Function

Public Sub RefreshRecordCount()
If m_isOpen Then
m_totalRecords = LOF(m_fileNum) \ m_recordLength
End If
End Sub

Public Sub CloseFile()
If m_isOpen Then
Close #m_fileNum
m_isOpen = False
m_totalRecords = 0
End If
End Sub

Private Sub Class_Terminate()
CloseFile
End Sub

Example 3: File Copy with Progress

Sub CopyFileWithProgress(ByVal sourceFile As String, _
ByVal destFile As String, _
Optional ByVal progressBar As ProgressBar = Nothing)
Dim sourceNum As Integer, destNum As Integer
Dim buffer(1 To 4096) As Byte
Dim bytesRead As Long
Dim totalSize As Long
Dim lastPercent As Integer
Dim currentPercent As Integer

' Open source file
sourceNum = FreeFile
Open sourceFile For Binary As #sourceNum
totalSize = LOF(sourceNum)

' Open destination file
destNum = FreeFile
Open destFile For Binary As #destNum

' Copy in chunks
Do While Loc(sourceNum) < totalSize
Get #sourceNum, , buffer
Put #destNum, , buffer

If Not progressBar Is Nothing Then
bytesRead = Loc(sourceNum)
currentPercent = Int((bytesRead / totalSize) * 100)

If currentPercent <> lastPercent Then
progressBar.Value = currentPercent
lastPercent = currentPercent
DoEvents
End If
End If
Loop

Close #sourceNum
Close #destNum
End Sub

Example 4: File Information Display

' Form with labels and progress bar
Private m_fileNum As Integer
Private m_fileSize As Long

Private Sub OpenAndDisplayFile(ByVal filename As String)
m_fileNum = FreeFile
Open filename For Binary As #m_fileNum
m_fileSize = LOF(m_fileNum)

' Display file information
lblFilename.Caption = filename
lblFileSize.Caption = FormatBytes(m_fileSize)
ProgressBar1.Min = 0
ProgressBar1.Max = 100

Timer1.Enabled = True
End Sub

Private Sub ProcessFile()
Dim data As Byte

Do While Loc(m_fileNum) < m_fileSize
Get #m_fileNum, , data
ProcessByte data
Loop

Timer1.Enabled = False
Close #m_fileNum
MsgBox "Processing complete!"
End Sub

Private Sub Timer1_Timer()
UpdateProgress
End Sub

Private Sub UpdateProgress()
Dim bytesProcessed As Long
Dim percent As Single

On Error Resume Next
bytesProcessed = Loc(m_fileNum)

If m_fileSize > 0 Then
percent = (bytesProcessed / m_fileSize) * 100
ProgressBar1.Value = percent

lblProgress.Caption = FormatBytes(bytesProcessed) & " of " & _
FormatBytes(m_fileSize) & " (" & _
Format(percent, "0.0") & "%)"
End If
End Sub

Private Function FormatBytes(ByVal bytes As Long) As String
If bytes < 1024 Then
FormatBytes = bytes & " B"
ElseIf bytes < 1048576 Then
FormatBytes = Format(bytes / 1024, "0.0") & " KB"
ElseIf bytes < 1073741824 Then
FormatBytes = Format(bytes / 1048576, "0.0") & " MB"
Else
FormatBytes = Format(bytes / 1073741824, "0.0") & " GB"
End If
End Function

Error Handling

' Error 52: Bad file name or number
On Error Resume Next
size = LOF(999)
If Err.Number = 52 Then
MsgBox "File not open!"
End If

' Error 68: Device unavailable
size = LOF(fileNum)
If Err.Number = 68 Then
MsgBox "Device unavailable!"
End If

' Safe size retrieval
Function GetSafeFileSize(ByVal fileNum As Integer) As Long
On Error Resume Next
GetSafeFileSize = LOF(fileNum)
If Err.Number <> 0 Then
GetSafeFileSize = -1
Err.Clear
End If
End Function

Performance Considerations

Best Practices

  1. Cache the value if using LOF multiple times in a loop
  2. Check for zero to detect empty files
  3. Use for buffer allocation when reading entire files
  4. Combine with Loc for progress calculation
  5. Use integer division (\) for record count calculation
  6. Handle errors for unopened files
  7. Check 2GB limit for very large files
  8. Refresh if writing as file size may change
  9. Use with Random files to calculate record count
  10. Prefer over FileLen for open files
Function Purpose File State Return Value
LOF Get file size Must be open Size in bytes
FileLen Get file size Must be closed Size in bytes
Loc Get position Must be open Current position
Seek Get/set position Must be open Next position
EOF Check end Must be open Boolean

LOF vs FileLen

' FileLen - for closed files
size = FileLen("data.dat")

' LOF - for open files
Open "data.dat" For Binary As #1
size = LOF(1)
Close #1

' LOF is better for open files:
' - Reflects current size if file is being written
' - Faster (no need to close and reopen)
' - Works with all file modes

Mode-Specific Usage

' Binary mode - get exact byte count
Open "data.bin" For Binary As #1
totalBytes = LOF(1)

' Random mode - calculate record count
Open "records.dat" For Random As #1 Len = 128
totalRecords = LOF(1) \ 128

' Input mode - get file size for progress
Open "text.txt" For Input As #1
fileSize = LOF(1)

' Output/Append mode - check current size
Open "log.txt" For Append As #1
currentSize = LOF(1)

Platform Notes

Limitations

← Back to File | View all functions