VB6Parse / Library / File / getattr

VB6 Library Reference

GetAttr Function

Returns an Integer representing the attributes of a file, directory, or folder.

Syntax

GetAttr(pathname)

Parameters

Return Value

Returns an Integer representing the sum of the following attribute values:

Constant Value Description
vbNormal 0 Normal (no attributes set)
vbReadOnly 1 Read-only
vbHidden 2 Hidden
vbSystem 4 System file
vbVolume 8 Volume label
vbDirectory 16 Directory or folder
vbArchive 32 File has changed since last backup
vbAlias 64 Specified file name is an alias (Macintosh only)

Remarks

Typical Uses

Basic Usage Examples

' Check if file is read-only
Dim attr As Integer
attr = GetAttr("C:\data.txt")

If attr And vbReadOnly Then
MsgBox "File is read-only"
End If

' Check if path is a directory
Dim pathAttr As Integer
pathAttr = GetAttr("C:\MyFolder")

If pathAttr And vbDirectory Then
MsgBox "This is a directory"
End If

' Check for hidden file
Dim fileAttr As Integer
fileAttr = GetAttr("C:\hidden.sys")

If fileAttr And vbHidden Then
MsgBox "File is hidden"
End If

' Check for system file
If GetAttr("C:\Windows\System32\ntoskrnl.exe") And vbSystem Then
MsgBox "This is a system file"
End If

Common Patterns

1. Check Read-Only Before Writing

Sub WriteToFile(filename As String, content As String)
Dim attr As Integer

On Error GoTo ErrorHandler

attr = GetAttr(filename)

If attr And vbReadOnly Then
MsgBox "Cannot write to read-only file: " & filename
Exit Sub
End If

' Proceed with writing
Dim fileNum As Integer
fileNum = FreeFile
Open filename For Output As #fileNum
Print #fileNum, content
Close #fileNum

Exit Sub

ErrorHandler:
MsgBox "Error accessing file: " & Err.Description
End Sub

2. Detect Directory vs File

Function IsDirectory(path As String) As Boolean
On Error GoTo ErrorHandler

Dim attr As Integer
attr = GetAttr(path)

IsDirectory = (attr And vbDirectory) <> 0
Exit Function

ErrorHandler:
IsDirectory = False
End Function

' Usage
If IsDirectory("C:\Windows") Then
Debug.Print "Path is a directory"
Else
Debug.Print "Path is a file"
End If

3. Find Hidden Files

Sub ListHiddenFiles(folderPath As String)
Dim filename As String
Dim fullPath As String
Dim attr As Integer

filename = Dir(folderPath & "\*.*", vbHidden)

Do While filename <> ""
fullPath = folderPath & "\" & filename

On Error Resume Next
attr = GetAttr(fullPath)
On Error GoTo 0

If (attr And vbHidden) And Not (attr And vbDirectory) Then
Debug.Print "Hidden file: " & filename
End If

filename = Dir
Loop
End Sub

4. Check Multiple Attributes

Function GetFileAttributeDescription(filename As String) As String
Dim attr As Integer
Dim description As String

On Error GoTo ErrorHandler

attr = GetAttr(filename)
description = ""

If attr = vbNormal Then
description = "Normal"
Else
If attr And vbReadOnly Then description = description & "Read-Only "
If attr And vbHidden Then description = description & "Hidden "
If attr And vbSystem Then description = description & "System "
If attr And vbDirectory Then description = description & "Directory "
If attr And vbArchive Then description = description & "Archive "
End If

GetFileAttributeDescription = Trim(description)
Exit Function

ErrorHandler:
GetFileAttributeDescription = "Error: " & Err.Description
End Function

5. Safe File Delete

Function SafeDeleteFile(filename As String) As Boolean
Dim attr As Integer

On Error GoTo ErrorHandler

' Check if file exists and get attributes
attr = GetAttr(filename)

' Don't delete system or read-only files
If attr And vbSystem Then
MsgBox "Cannot delete system file: " & filename
SafeDeleteFile = False
Exit Function
End If

' Remove read-only attribute if set
If attr And vbReadOnly Then
SetAttr filename, attr And Not vbReadOnly
End If

' Delete the file
Kill filename
SafeDeleteFile = True
Exit Function

ErrorHandler:
MsgBox "Error deleting file: " & Err.Description
SafeDeleteFile = False
End Function

6. List Files by Attribute

Sub ListFilesByAttribute(folderPath As String, attributeFlag As Integer)
Dim filename As String
Dim fullPath As String
Dim attr As Integer

filename = Dir(folderPath & "\*.*", vbNormal + vbHidden + vbSystem)

Do While filename <> ""
fullPath = folderPath & "\" & filename

On Error Resume Next
attr = GetAttr(fullPath)
On Error GoTo 0

If (attr And attributeFlag) And Not (attr And vbDirectory) Then
Debug.Print filename & " (Attribute: " & attr & ")"
End If

filename = Dir
Loop
End Sub

' Usage
ListFilesByAttribute "C:\Temp", vbArchive  ' List files needing backup

7. Backup File Scanner

Function NeedsBackup(filename As String) As Boolean
Dim attr As Integer

On Error GoTo ErrorHandler

attr = GetAttr(filename)

' Check if archive bit is set
NeedsBackup = (attr And vbArchive) <> 0
Exit Function

ErrorHandler:
NeedsBackup = False
End Function

Sub FindFilesNeedingBackup(folderPath As String, lst As ListBox)
Dim filename As String
Dim fullPath As String

lst.Clear
filename = Dir(folderPath & "\*.*")

Do While filename <> ""
fullPath = folderPath & "\" & filename

If NeedsBackup(fullPath) Then
lst.AddItem filename
End If

filename = Dir
Loop
End Sub

8. File Permission Check

Function CanModifyFile(filename As String) As Boolean
Dim attr As Integer

On Error GoTo ErrorHandler

attr = GetAttr(filename)

' File can be modified if it's not read-only and not a system file
CanModifyFile = Not ((attr And vbReadOnly) Or (attr And vbSystem))
Exit Function

ErrorHandler:
CanModifyFile = False
End Function

Sub ModifyFileIfAllowed(filename As String)
If CanModifyFile(filename) Then
' Proceed with modification
Debug.Print "File can be modified"
Else
Debug.Print "File is protected"
End If
End Sub

9. Directory Tree Walker

Sub WalkDirectory(path As String, Optional level As Integer = 0)
Dim filename As String
Dim fullPath As String
Dim attr As Integer
Dim indent As String

indent = String(level * 2, " ")
filename = Dir(path & "\*.*", vbDirectory)

Do While filename <> ""
If filename <> "." And filename <> ".." Then
fullPath = path & "\" & filename

On Error Resume Next
attr = GetAttr(fullPath)
On Error GoTo 0

If attr And vbDirectory Then
Debug.Print indent & "[DIR] " & filename
WalkDirectory fullPath, level + 1
Else
Debug.Print indent & filename
End If
End If

filename = Dir
Loop
End Sub

10. File Attribute Report

Sub GenerateAttributeReport(folderPath As String)
Dim filename As String
Dim fullPath As String
Dim attr As Integer
Dim normalCount As Long
Dim readOnlyCount As Long
Dim hiddenCount As Long
Dim systemCount As Long
Dim archiveCount As Long

filename = Dir(folderPath & "\*.*", vbNormal + vbHidden + vbSystem)

Do While filename <> ""
fullPath = folderPath & "\" & filename

On Error Resume Next
attr = GetAttr(fullPath)
On Error GoTo 0

If Not (attr And vbDirectory) Then
If attr = vbNormal Then normalCount = normalCount + 1
If attr And vbReadOnly Then readOnlyCount = readOnlyCount + 1
If attr And vbHidden Then hiddenCount = hiddenCount + 1
If attr And vbSystem Then systemCount = systemCount + 1
If attr And vbArchive Then archiveCount = archiveCount + 1
End If

filename = Dir
Loop

Debug.Print "File Attribute Report for: " & folderPath
Debug.Print String(50, "=")
Debug.Print "Normal: " & normalCount
Debug.Print "Read-Only: " & readOnlyCount
Debug.Print "Hidden: " & hiddenCount
Debug.Print "System: " & systemCount
Debug.Print "Archive: " & archiveCount
End Sub

Advanced Usage

1. File Attribute Manager Class

' Class: FileAttributeManager
Private m_Filename As String
Private m_Attributes As Integer

Public Sub LoadFile(filename As String)
m_Filename = filename
RefreshAttributes
End Sub

Private Sub RefreshAttributes()
On Error Resume Next
m_Attributes = GetAttr(m_Filename)
On Error GoTo 0
End Sub

Public Property Get IsReadOnly() As Boolean
IsReadOnly = (m_Attributes And vbReadOnly) <> 0
End Property

Public Property Let IsReadOnly(value As Boolean)
If value Then
SetAttr m_Filename, m_Attributes Or vbReadOnly
Else
SetAttr m_Filename, m_Attributes And Not vbReadOnly
End If
RefreshAttributes
End Property

Public Property Get IsHidden() As Boolean
IsHidden = (m_Attributes And vbHidden) <> 0
End Property

Public Property Let IsHidden(value As Boolean)
If value Then
SetAttr m_Filename, m_Attributes Or vbHidden
Else
SetAttr m_Filename, m_Attributes And Not vbHidden
End If
RefreshAttributes
End Property

Public Property Get IsDirectory() As Boolean
IsDirectory = (m_Attributes And vbDirectory) <> 0
End Property

Public Property Get AttributeValue() As Integer
AttributeValue = m_Attributes
End Property

2. Smart File Filter

Type FileFilter
IncludeReadOnly As Boolean
IncludeHidden As Boolean
IncludeSystem As Boolean
IncludeArchive As Boolean
ExcludeDirectories As Boolean
End Type

Function MatchesFilter(filename As String, filter As FileFilter) As Boolean
Dim attr As Integer

On Error GoTo ErrorHandler

attr = GetAttr(filename)

' Check exclusions first
If filter.ExcludeDirectories And (attr And vbDirectory) Then
MatchesFilter = False
Exit Function
End If

' Check inclusions
MatchesFilter = True

If Not filter.IncludeReadOnly And (attr And vbReadOnly) Then
MatchesFilter = False
ElseIf Not filter.IncludeHidden And (attr And vbHidden) Then
MatchesFilter = False
ElseIf Not filter.IncludeSystem And (attr And vbSystem) Then
MatchesFilter = False
ElseIf Not filter.IncludeArchive And (attr And vbArchive) Then
MatchesFilter = False
End If

Exit Function

ErrorHandler:
MatchesFilter = False
End Function

3. Attribute Change Monitor

Type FileSnapshot
Filename As String
Attributes As Integer
Timestamp As Date
End Type

Private m_Snapshots As Collection

Sub InitializeMonitor()
Set m_Snapshots = New Collection
End Sub

Sub TakeSnapshot(filename As String)
Dim snapshot As FileSnapshot

snapshot.Filename = filename
snapshot.Attributes = GetAttr(filename)
snapshot.Timestamp = Now

m_Snapshots.Add snapshot, filename
End Sub

Function DetectAttributeChanges(filename As String) As Boolean
Dim currentAttr As Integer
Dim snapshot As FileSnapshot
Dim i As Long

currentAttr = GetAttr(filename)

' Find snapshot
For i = 1 To m_Snapshots.Count
snapshot = m_Snapshots(i)
If snapshot.Filename = filename Then
DetectAttributeChanges = (snapshot.Attributes <> currentAttr)
Exit Function
End If
Next i

DetectAttributeChanges = False
End Function

4. Bulk Attribute Operations

Sub SetAttributeForMultipleFiles(filenames() As String, _
attributeToSet As Integer, _
enable As Boolean)
Dim i As Long
Dim currentAttr As Integer
Dim newAttr As Integer

For i = LBound(filenames) To UBound(filenames)
On Error Resume Next

currentAttr = GetAttr(filenames(i))

If enable Then
newAttr = currentAttr Or attributeToSet
Else
newAttr = currentAttr And Not attributeToSet
End If

SetAttr filenames(i), newAttr

On Error GoTo 0
Next i
End Sub

' Usage
Sub MakeFilesReadOnly()
Dim files() As String
files = Array("file1.txt", "file2.txt", "file3.txt")

SetAttributeForMultipleFiles files, vbReadOnly, True
End Sub

5. File Security Analyzer

Type SecurityIssue
Filename As String
IssueType As String
Severity As String
End Type

Function AnalyzeFileSecurity(folderPath As String) As Collection
Dim issues As New Collection
Dim filename As String
Dim fullPath As String
Dim attr As Integer
Dim issue As SecurityIssue

filename = Dir(folderPath & "\*.*", vbNormal + vbHidden + vbSystem)

Do While filename <> ""
fullPath = folderPath & "\" & filename

On Error Resume Next
attr = GetAttr(fullPath)
On Error GoTo 0

If Not (attr And vbDirectory) Then
' Check for security issues

' Issue 1: System files that are not hidden
If (attr And vbSystem) And Not (attr And vbHidden) Then
issue.Filename = filename
issue.IssueType = "System file not hidden"
issue.Severity = "Medium"
issues.Add issue
End If

' Issue 2: Important files not marked read-only
If InStr(1, filename, "config", vbTextCompare) > 0 Then
If Not (attr And vbReadOnly) Then
issue.Filename = filename
issue.IssueType = "Config file not read-only"
issue.Severity = "Low"
issues.Add issue
End If
End If
End If

filename = Dir
Loop

Set AnalyzeFileSecurity = issues
End Function

6. Attribute Comparison Tool

Function CompareFileAttributes(file1 As String, file2 As String) As String
Dim attr1 As Integer
Dim attr2 As Integer
Dim differences As String

On Error GoTo ErrorHandler

attr1 = GetAttr(file1)
attr2 = GetAttr(file2)

differences = ""

If (attr1 And vbReadOnly) <> (attr2 And vbReadOnly) Then
differences = differences & "Read-Only differs" & vbCrLf
End If

If (attr1 And vbHidden) <> (attr2 And vbHidden) Then
differences = differences & "Hidden differs" & vbCrLf
End If

If (attr1 And vbSystem) <> (attr2 And vbSystem) Then
differences = differences & "System differs" & vbCrLf
End If

If (attr1 And vbArchive) <> (attr2 And vbArchive) Then
differences = differences & "Archive differs" & vbCrLf
End If

If differences = "" Then
CompareFileAttributes = "Attributes are identical"
Else
CompareFileAttributes = "Differences found:" & vbCrLf & differences
End If

Exit Function

ErrorHandler:
CompareFileAttributes = "Error: " & Err.Description
End Function

Error Handling

Function SafeGetAttr(pathname As String, _
Optional defaultValue As Integer = -1) As Integer
On Error GoTo ErrorHandler

SafeGetAttr = GetAttr(pathname)
Exit Function

ErrorHandler:
Select Case Err.Number
Case 53  ' File not found
Debug.Print "File not found: " & pathname
Case 76  ' Path not found
Debug.Print "Path not found: " & pathname
Case 68  ' Device unavailable
Debug.Print "Device unavailable: " & pathname
Case Else
Debug.Print "Error " & Err.Number & ": " & Err.Description
End Select

SafeGetAttr = defaultValue
End Function

Common errors: - Error 53 (File not found): The specified file doesn't exist. - Error 76 (Path not found): The specified path doesn't exist. - Error 68 (Device unavailable): Network drive or removable media not available.

Performance Considerations

Best Practices

  1. Always use error handling - file may not exist
  2. Use bitwise AND to test individual attributes
  3. Check Dir first if file existence is uncertain
  4. Cache results when checking attributes repeatedly
  5. Use constants (vbReadOnly, etc.) instead of numeric values
  6. Handle network paths carefully - may be unavailable
  7. Don't assume attributes - always check explicitly

Comparison with Other Functions

GetAttr vs FileLen

' GetAttr - Returns file attributes
attr = GetAttr("file.txt")  ' Returns attribute flags

' FileLen - Returns file size
size = FileLen("file.txt")  ' Returns size in bytes

GetAttr vs Dir

' GetAttr - Gets attributes of specific file
attr = GetAttr("file.txt")

' Dir - Searches for files matching pattern
filename = Dir("*.txt", vbNormal)

GetAttr vs FileDateTime

' GetAttr - Returns attributes
attr = GetAttr("file.txt")

' FileDateTime - Returns modification date/time
dt = FileDateTime("file.txt")

Limitations

Bitwise Operations

Testing for specific attributes:

' Test if read-only
If (attr And vbReadOnly) Then ' Has read-only attribute

' Test if NOT read-only
If Not (attr And vbReadOnly) Then ' Doesn't have read-only

' Test for multiple attributes
If (attr And (vbReadOnly Or vbHidden)) Then ' Has either attribute

' Test for exact attribute combination
If attr = (vbReadOnly Or vbHidden) Then ' Has exactly these two

Related Functions

← Back to File | View all functions