VB6Parse / Library / File / filelen

VB6 Library Reference

FileLen Function

Returns a Long specifying the length of a file in bytes.

Syntax

FileLen(pathname)

Parameters

Return Value

Returns a Long representing the length of the file in bytes. For open files, the value returned is the size of the file immediately before it was opened.

Remarks

The FileLen function returns the size of a file in bytes. This is useful for determining file sizes before reading, checking disk space requirements, validating file downloads, and managing storage.

Important Characteristics:

Typical Uses

Examples

Basic Usage

Dim fileSize As Long

' Get file size in bytes
fileSize = FileLen("C:\data.txt")
Debug.Print "File size: " & fileSize & " bytes"

' Convert to KB, MB, GB
Debug.Print "Size in KB: " & Format(fileSize / 1024, "0.00")
Debug.Print "Size in MB: " & Format(fileSize / 1048576, "0.00")

Format File Size for Display

Function FormatFileSize(bytes As Long) As String
Const KB = 1024
Const MB = 1048576         ' 1024 * 1024
Const GB = 1073741824      ' 1024 * 1024 * 1024

If bytes >= GB Then
FormatFileSize = Format(bytes / GB, "0.00") & " GB"
ElseIf bytes >= MB Then
FormatFileSize = Format(bytes / MB, "0.00") & " MB"
ElseIf bytes >= KB Then
FormatFileSize = Format(bytes / KB, "0.00") & " KB"
Else
FormatFileSize = bytes & " bytes"
End If
End Function

' Usage
Debug.Print FormatFileSize(FileLen("C:\data.txt"))

Check If File Exists and Get Size

Function GetFileSize(filePath As String) As Long
On Error GoTo ErrorHandler

GetFileSize = FileLen(filePath)
Exit Function

ErrorHandler:
GetFileSize = -1  ' Indicate error
End Function

Common Patterns

Calculate Directory Size

Function GetDirectorySize(folderPath As String) As Long
Dim fileName As String
Dim totalSize As Long
Dim fileSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")
totalSize = 0

Do While fileName <> ""
On Error Resume Next
fileSize = FileLen(folderPath & fileName)

If Err.Number = 0 Then
totalSize = totalSize + fileSize
End If

Err.Clear
fileName = Dir
Loop

GetDirectorySize = totalSize
End Function

Find Largest File

Function FindLargestFile(folderPath As String) As String
Dim fileName As String
Dim largestFile As String
Dim largestSize As Long
Dim currentSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")
largestSize = 0

Do While fileName <> ""
On Error Resume Next
currentSize = FileLen(folderPath & fileName)

If Err.Number = 0 And currentSize > largestSize Then
largestSize = currentSize
largestFile = fileName
End If

Err.Clear
fileName = Dir
Loop

FindLargestFile = largestFile
End Function

Filter Files by Size

Function GetFilesBySize(folderPath As String, minSize As Long, _
maxSize As Long) As Collection
Dim files As New Collection
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
If fileSize >= minSize And fileSize <= maxSize Then
files.Add fullPath
End If
End If

Err.Clear
fileName = Dir
Loop

Set GetFilesBySize = files
End Function

Validate File Download

Function ValidateDownload(filePath As String, expectedSize As Long) As Boolean
On Error GoTo ErrorHandler

Dim actualSize As Long
actualSize = FileLen(filePath)

ValidateDownload = (actualSize = expectedSize)

If Not ValidateDownload Then
Debug.Print "Size mismatch - Expected: " & expectedSize & _
", Actual: " & actualSize
End If

Exit Function

ErrorHandler:
ValidateDownload = False
End Function

Check Available Space

Function HasEnoughSpace(filePath As String, drive As String) As Boolean
On Error GoTo ErrorHandler

Dim fileSize As Long
Dim freeSpace As Currency
Dim fso As Object

' Get file size
fileSize = FileLen(filePath)

' Get free space (using FileSystemObject)
Set fso = CreateObject("Scripting.FileSystemObject")
freeSpace = fso.GetDrive(drive).FreeSpace

HasEnoughSpace = (freeSpace > fileSize)
Exit Function

ErrorHandler:
HasEnoughSpace = False
End Function

Progress Bar for File Copy

Sub CopyFileWithProgress(sourceFile As String, destFile As String)
Dim fileSize As Long
Dim buffer() As Byte
Dim sourceNum As Integer
Dim destNum As Integer
Dim bytesRead As Long
Dim chunkSize As Long

On Error GoTo ErrorHandler

' Get total file size
fileSize = FileLen(sourceFile)

If fileSize = 0 Then Exit Sub

chunkSize = 65536  ' 64KB chunks
bytesRead = 0

sourceNum = FreeFile
Open sourceFile For Binary As #sourceNum

destNum = FreeFile
Open destFile For Binary As #destNum

Do While bytesRead < fileSize
If fileSize - bytesRead < chunkSize Then
chunkSize = fileSize - bytesRead
End If

ReDim buffer(0 To chunkSize - 1)
Get #sourceNum, , buffer
Put #destNum, , buffer

bytesRead = bytesRead + chunkSize

' Update progress bar
ProgressBar.Value = (bytesRead / fileSize) * 100
DoEvents
Loop

Close #sourceNum
Close #destNum
Exit Sub

ErrorHandler:
If sourceNum > 0 Then Close #sourceNum
If destNum > 0 Then Close #destNum
End Sub

List Files with Sizes

Sub ListFilesWithSizes(folderPath As String)
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

Debug.Print "Files in: " & folderPath
Debug.Print String(60, "-")
Debug.Print "Filename", "Size"
Debug.Print String(60, "-")

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
Debug.Print fileName, FormatFileSize(fileSize)
End If

Err.Clear
fileName = Dir
Loop
End Sub

Allocate Buffer Based on File Size

Function ReadFileToBuffer(filePath As String) As Byte()
Dim fileSize As Long
Dim buffer() As Byte
Dim fileNum As Integer

On Error GoTo ErrorHandler

' Get file size to allocate exact buffer
fileSize = FileLen(filePath)

If fileSize = 0 Then
ReadFileToBuffer = buffer
Exit Function
End If

' Allocate buffer
ReDim buffer(0 To fileSize - 1)

' Read file
fileNum = FreeFile
Open filePath For Binary As #fileNum
Get #fileNum, , buffer
Close #fileNum

ReadFileToBuffer = buffer
Exit Function

ErrorHandler:
If fileNum > 0 Then Close #fileNum
ReadFileToBuffer = buffer
End Function

Find Empty Files

Function FindEmptyFiles(folderPath As String) As Collection
Dim emptyFiles As New Collection
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 And fileSize = 0 Then
emptyFiles.Add fullPath
End If

Err.Clear
fileName = Dir
Loop

Set FindEmptyFiles = emptyFiles
End Function

Compare File Sizes

Function CompareFileSizes(file1 As String, file2 As String) As Long
' Returns: -1 if file1 < file2, 0 if equal, 1 if file1 > file2
On Error GoTo ErrorHandler

Dim size1 As Long
Dim size2 As Long

size1 = FileLen(file1)
size2 = FileLen(file2)

If size1 < size2 Then
CompareFileSizes = -1
ElseIf size1 > size2 Then
CompareFileSizes = 1
Else
CompareFileSizes = 0
End If

Exit Function

ErrorHandler:
CompareFileSizes = 0
End Function

Advanced Usage

Disk Usage Report

Type DirectoryStats
Path As String
FileCount As Long
TotalSize As Long
LargestFile As String
LargestSize As Long
SmallestFile As String
SmallestSize As Long
AverageSize As Long
End Type

Function AnalyzeDirectory(folderPath As String) As DirectoryStats
Dim stats As DirectoryStats
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

stats.Path = folderPath
stats.FileCount = 0
stats.TotalSize = 0
stats.LargestSize = 0
stats.SmallestSize = 2147483647  ' Max Long

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
stats.FileCount = stats.FileCount + 1
stats.TotalSize = stats.TotalSize + fileSize

If fileSize > stats.LargestSize Then
stats.LargestSize = fileSize
stats.LargestFile = fileName
End If

If fileSize < stats.SmallestSize Then
stats.SmallestSize = fileSize
stats.SmallestFile = fileName
End If
End If

Err.Clear
fileName = Dir
Loop

If stats.FileCount > 0 Then
stats.AverageSize = stats.TotalSize / stats.FileCount
End If

AnalyzeDirectory = stats
End Function

Sort Files by Size

Type FileSizeInfo
Name As String
Size As Long
End Type

Function GetFilesSortedBySize(folderPath As String) As Variant
Dim files() As FileSizeInfo
Dim fileName As String
Dim fullPath As String
Dim count As Long
Dim i As Long, j As Long
Dim temp As FileSizeInfo

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

ReDim files(0 To 100)
count = 0
fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
files(count).Name = fileName
files(count).Size = FileLen(fullPath)

If Err.Number = 0 Then
count = count + 1
If count > UBound(files) Then
ReDim Preserve files(0 To UBound(files) + 100)
End If
End If

Err.Clear
fileName = Dir
Loop

If count > 0 Then
ReDim Preserve files(0 To count - 1)

' Bubble sort by size (largest first)
For i = 0 To count - 2
For j = i + 1 To count - 1
If files(j).Size > files(i).Size Then
temp = files(i)
files(i) = files(j)
files(j) = temp
End If
Next j
Next i
End If

GetFilesSortedBySize = files
End Function

File Size Distribution

Type SizeDistribution
Range As String
Count As Long
TotalSize As Long
End Type

Function GetSizeDistribution(folderPath As String) As Variant
Dim dist(0 To 5) As SizeDistribution
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

' Define ranges
dist(0).Range = "< 1 KB"
dist(1).Range = "1 KB - 100 KB"
dist(2).Range = "100 KB - 1 MB"
dist(3).Range = "1 MB - 10 MB"
dist(4).Range = "10 MB - 100 MB"
dist(5).Range = "> 100 MB"

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
If fileSize < 1024 Then
dist(0).Count = dist(0).Count + 1
dist(0).TotalSize = dist(0).TotalSize + fileSize
ElseIf fileSize < 102400 Then
dist(1).Count = dist(1).Count + 1
dist(1).TotalSize = dist(1).TotalSize + fileSize
ElseIf fileSize < 1048576 Then
dist(2).Count = dist(2).Count + 1
dist(2).TotalSize = dist(2).TotalSize + fileSize
ElseIf fileSize < 10485760 Then
dist(3).Count = dist(3).Count + 1
dist(3).TotalSize = dist(3).TotalSize + fileSize
ElseIf fileSize < 104857600 Then
dist(4).Count = dist(4).Count + 1
dist(4).TotalSize = dist(4).TotalSize + fileSize
Else
dist(5).Count = dist(5).Count + 1
dist(5).TotalSize = dist(5).TotalSize + fileSize
End If
End If

Err.Clear
fileName = Dir
Loop

GetSizeDistribution = dist
End Function

Quota Management

Function CheckQuota(userFolder As String, quotaLimit As Long) As Boolean
Dim totalSize As Long
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long

If Right(userFolder, 1) <> "\" Then
userFolder = userFolder & "\"
End If

totalSize = 0
fileName = Dir(userFolder & "*.*")

Do While fileName <> ""
fullPath = userFolder & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
totalSize = totalSize + fileSize
End If

Err.Clear
fileName = Dir
Loop

If totalSize > quotaLimit Then
MsgBox "Quota exceeded!" & vbCrLf & _
"Used: " & FormatFileSize(totalSize) & vbCrLf & _
"Limit: " & FormatFileSize(quotaLimit), vbExclamation
CheckQuota = False
Else
CheckQuota = True
End If
End Function

Duplicate File Finder (by size)

Function FindPotentialDuplicates(folderPath As String) As Collection
' Files with same size are potential duplicates
Dim sizeMap As New Collection
Dim duplicates As New Collection
Dim fileName As String
Dim fullPath As String
Dim fileSize As Long
Dim sizeKey As String

If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If

fileName = Dir(folderPath & "*.*")

Do While fileName <> ""
fullPath = folderPath & fileName

On Error Resume Next
fileSize = FileLen(fullPath)

If Err.Number = 0 Then
sizeKey = CStr(fileSize)

' Try to add to collection
Err.Clear
sizeMap.Add fullPath, sizeKey

If Err.Number <> 0 Then
' Duplicate size found
duplicates.Add fullPath
End If
End If

Err.Clear
fileName = Dir
Loop

Set FindPotentialDuplicates = duplicates
End Function

Error Handling

Function SafeFileLen(filePath As String) As Long
On Error GoTo ErrorHandler

SafeFileLen = FileLen(filePath)
Exit Function

ErrorHandler:
Select Case Err.Number
Case 53  ' File not found
Debug.Print "File not found: " & filePath
SafeFileLen = -1
Case 76  ' Path not found
Debug.Print "Path not found: " & filePath
SafeFileLen = -1
Case Else
Debug.Print "Error " & Err.Number & ": " & Err.Description
SafeFileLen = -1
End Select
End Function

Common Errors

Performance Considerations

Best Practices

Check File Existence First

' Good - Check existence to avoid error
If Dir(filePath) <> "" Then
fileSize = FileLen(filePath)
Else
MsgBox "File not found"
End If

' Or use error handling
On Error Resume Next
fileSize = FileLen(filePath)
If Err.Number <> 0 Then
MsgBox "Cannot get file size"
End If
On Error GoTo 0

Format for Display

' Good - Format sizes for readability
Dim size As Long
size = FileLen(filePath)
MsgBox "File size: " & FormatFileSize(size)

' Bad - Raw bytes for large files
MsgBox "File size: " & FileLen(filePath) & " bytes"

Comparison with Other Functions

FileLen vs LOF

' FileLen - For closed files, returns current size
fileSize = FileLen("C:\data.txt")

' LOF - For open files only, returns current size
Open "C:\data.txt" For Input As #1
fileSize = LOF(1)
Close #1

FileLen vs FileSystemObject.GetFile.Size

' FileLen - Built-in VB6 function
fileSize = FileLen("C:\data.txt")

' FSO - Requires reference to Scripting Runtime
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fileSize = fso.GetFile("C:\data.txt").Size

Limitations

← Back to File | View all functions