LOF Function
Returns a Long representing the size, in bytes, of a file opened using the Open statement.
Syntax
LOF(filenumber)
Parameters
filenumber(Required): Integer file number used in the Open statement- Must be a valid file number from a currently open file
- File numbers typically obtained from
FreeFilefunction - Must be between 1 and 511
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:
- Works with all file access modes (Binary, Random, Input, Output, Append)
- Returns size in bytes regardless of mode
- File must be open before calling LOF
- Does not change file pointer position
- Read-only operation (non-destructive)
- Useful for calculating progress during file operations
- Essential for determining number of records in Random files
- Used to allocate buffers for reading entire file
- Can be used with Loc to calculate percentage complete
- Error 52 "Bad file name or number" if file not open
- Error 68 "Device unavailable" if device unavailable
- For Random files, divide by record length to get record count
- Returns current size, even if file is being written to
- More reliable than
FileLenfor open files FileLenworks on closed files, LOF works on open files- Common in loops reading files to completion
- Used to detect empty files (LOF returns 0)
- Essential for progress bars and status indicators
- Helps prevent reading past end of file
Typical Uses
- Get File Size
fileSize = LOF(1)
- Calculate Record Count
recordCount = LOF(fileNum) / Len(record)
- Read Entire File
buffer = String(LOF(fileNum), 0)
Get #fileNum, , buffer
- Progress Calculation
percent = (Loc(fileNum) / LOF(fileNum)) * 100
- Check Empty File
If LOF(fileNum) = 0 Then
MsgBox "File is empty"
End If
- Loop Until End
Do While Loc(fileNum) < LOF(fileNum)
Get #fileNum, , data
Loop
- Display File Size
lblSize.Caption = "Size: " & LOF(fileNum) & " bytes"
- 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
- Very Fast: LOF is a simple file system query
- No I/O: Does not read file contents
- Cache Result: Store in variable if using multiple times
- No Side Effects: Does not change file pointer
- Constant Time: O(1) operation regardless of file size
Best Practices
- Cache the value if using LOF multiple times in a loop
- Check for zero to detect empty files
- Use for buffer allocation when reading entire files
- Combine with Loc for progress calculation
- Use integer division (\) for record count calculation
- Handle errors for unopened files
- Check 2GB limit for very large files
- Refresh if writing as file size may change
- Use with Random files to calculate record count
- Prefer over
FileLenfor open files
Comparison with Related Functions
| 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
- Available in all VB6 versions
- Part of VBA core library
- Returns Long (max ~2GB file support)
- For files > 2GB, result may overflow (wraps to negative)
- Windows-specific file I/O
- Behavior identical across Windows versions
- Works with local and network files
- UNC paths supported
Limitations
- 2GB Limit: Long type limits to ~2,147,483,647 bytes
- Files > 2GB: Result overflows and becomes negative
- Requires Open File: Error 52 if file not open
- No String Files: Works with file numbers only
- Not for Directories: Only for files
- Static at Call: Returns size at moment of call
- No Metadata: Only returns size, not other attributes
Related Functions
Loc: Get current read/write position in fileSeek: Get/set file positionEOF: Check if at end of fileFileLen: Get length of closed fileOpen: Open file for I/OClose: Close open fileFreeFile: Get available file numberFileAttr: Get file mode or handle