File Handling And FSO Object
|
Tips >> Visual
Basic |
MAKE WEB APPLICATION WITHOUT KNOWLEDGE OF CODING? CLICK HERE
The File System Object (FSO) enables you to manipulate the
files, folders and drives as well as read and write to sequential
files. Before using the FSO, you have to add the "Microsoft
Scripting Runtime Library" to the current project by selecting
"Project", "References" from the
menu bar. Alternatively you can use the CreateObject function
to create the reference at run-time.
|
Set fso = CreateObject("Scripting.FileSystemObject") |
|
EXAMPLE PROGRAMS:
The following example programs illustrate how to use the
File System Object.
Listing subdirectories Recursively
Setting Attributes
Loading subdirectories into the TreeView control
FILE SYSTEM OBJECT:
There are five types of File System Object.
1. File.
2. Folder.
3. Drive.
4. TextStream.
5. Random Access Files.
The FileSystemObject is used to manipulate the files, folders
and directories. The following is a list of some of the methods
avaiable to the FileSystemObject.
File System Object Methods
|
Method |
Description |
CopyFile |
Used to copy an existing file. |
CopyFolder |
Used to copy an existing folder. |
CreateFolder |
Used to create a folder. |
CreateTextFile |
Used to create a text file. |
DeleteFile |
Used to delete a file. |
DeleteFolder |
Used to delete a folder. |
DriveExists |
Used to determine whether a drive exists. |
FileExists |
Used to determine whether a file exists. |
FolderExists |
Used to determine whether a folder exists. |
GetAbsolutePathName |
Used to return the full path name. |
GetDrive |
Used to return a specified drive. |
GetDriveName |
Used to return the drive name. |
GetFile |
Used to return a specified file. |
GetFileName |
Used to return the file name. |
GetFolder |
Used to return a specified folder. |
GetParentFolderName |
Used to return the name of the parent folder. |
GetTempName |
Used to create and return a string representing
a file name. |
MoveFile |
Used to move a file. |
MoveFolder |
Used to move a folder. |
OpenTextFile |
Used to open an existing text file. |
|
The FSO File Object
The following uses some of the FSO File's properties to display
information about a file.
|
Private Sub displayFileInfo(ByVal fileName
As String)
Dim fso As New FileSystemObject
Dim fileSpec As File
Dim strInfo As String
Set fileSpec = fso.GetFile(fileName)
strInfo = fileSpec.Name &
vbCrLf
strInfo = strInfo & "Created:
"
strInfo = strInfo & fileSpec.DateCreated
& vbCrLf
strInfo = strInfo & "Last
Accessed: "
strInfo = strInfo & fileSpec.DateLastAccessed
& vbCrLf
strInfo = strInfo & "Last
Modified: "
strInfo = strInfo & fileSpec.DateLastModified
MsgBox strInfo, vbInformation,
"File Information"
Set fileSpec = Nothing
End Sub |
|
The Copy, Delete, Move, and openAsTextStream methods are available
for the FSO File object.
The FSO Folder Object
The following uses some of the FSO Folder's properties to display
information about a folder.
|
Private Sub displayFolderInfo(ByVal folderName
As String)
Dim fso As New FileSystemObject
Dim folderSpec As Folder
Dim strInfo As String
Set folderSpec = fso.GetFolder(folderName)
strInfo = folderSpec.Name &
vbCrLf
strInfo = strInfo & "Created:
"
strInfo = strInfo & folderSpec.DateCreated
& vbCrLf
strInfo = strInfo & "Size:
"
strInfo = strInfo & folderSpec.Size
MsgBox strInfo, vbInformation,
"Folder Information"
Set folderSpec = Nothing
End Sub |
|
The Copy, CreateTextFile, Delete, and Move methods are available
for the FSO Folder object.
THE FSO DRIVE OBJECT
The following example iterates through the Drives collection
and writes the drive name for each drive found.
|
Dim fso As New FileSystemObject
Dim connectedDrives As drives, drv As Drive
Dim strInfo As String, driveName As String
Set connectedDrives = fso.drives
On Error Resume Next
For Each drv In connectedDrives
strInfo = strInfo & drv.DriveLetter
& ": "
' Check if the drive is shared
If drv.DriveType = 3 Then
driveName
= drv.ShareName
Else
driveName
= drv.VolumeName
End If
strInfo = strInfo & driveName
strInfo = strInfo & "
Free space: " & drv.FreeSpace
If drv.IsReady Then
strInfo
= strInfo & " ready" & vbCrLf
Else
strInfo
= strInfo & " not ready" & vbCrLf
End If
Next drv
MsgBox strInfo, vbInformation, "Connected Drives"
Set connectedDrives = Nothing
Set fso = Nothing |
|
The FSO TextStream Object
The FSO TextStream object is used to read and write to sequential
text files.
WRITING TEXT FILES
When writing to a file, you can either create a new file, overwrite
an existing file or append text to the end of an existing file.
The CreateTextFile method is used to create a text file
and return a reference to a TextStream object. The FSO
File object's OpenAsTextStream method may be used to
open a TextStream ForAppending, ForReading or ForWriting.
The Write method is used to write a string, the WriteBlankLine
method is used to write blank lines and the WriteLine method is
used to write a line of text ending with a newline character.
|
fsoStream.Write "Hello"
fsoStream.WriteBlankLines 2
fsoStream.WriteLine "First line in the text file." |
|
The FSO TextStream CreateTextFile Method
The following example creates a text file using the CreateTextFile
method.
The CreateTextFile method takes as parameters the filename
to be created and a Boolean value indicating whether the file should
be overwritten if it exists. The default value is True.
|
Dim fso As New FileSystemObject
Dim fsoStream As TextStream
' Create a text file, and return a reference to a TextStream
Set fsoStream = fso.CreateTextFile("c:\junk\junk.txt",
True)
' Write to the file
fsoStream.WriteLine "First line in the text file."
fsoStream.WriteBlankLines 2
fsoStream.WriteLine "Line after two blank lines."
fsoStream.Close
Set fsoStream = Nothing
Set fso = Nothing |
|
APPENDING TO THE END OF A TEXTSTREAM
To append to a file, open the TextStream using the ForAppending
parameter. Text written to the file is appended to the end.
|
Dim fso As New FileSystemObject
Dim f As File
Dim fsoStream As TextStream
Set f = fso.GetFile("c:\junk\junk.txt")
Set fsoStream = f.OpenAsTextStream(ForAppending)
' Append lines to the file
fsoStream.WriteLine "Appending line to the text file"
fsoStream.Close
Set fsoStream = Nothing
Set fso = Nothing |
|
READING TEXT FILES
The FSO File object's OpenAsTextFile(ForReading) is used
to open a text file for reading. The Read, ReadAll and ReadLine
methods are used to read from the text file.
The Read method takes as a parameter the number of characters
to be read.
The ReadAll method reads the whole text file. This is
not advisable for large files as it's a waste of memory.
The ReadLine method reads one line of text from the file.
The AtEndOfStream property may be used to test for the end
of file, and the AtEndOfLine property may be used to for the end
of a line.
|
singleChar = fsoStream.Read(1)
wholeFile = fsoStream.ReadAll
lineText = fsoStream.ReadLine |
|
The Skip(n) method may be used to skip n characters, and the
SkipLine method is used to skip a whole line.
READING EXAMPLE:
To read a file, open the TextStream using the ForReading parameter.
|
Dim fso As New FileSystemObject
Dim f As File
Dim fsoStream As TextStream
Dim strLine As String
Set f = fso.GetFile("c:\junk\junk.txt")
Set fsoStream = f.OpenAsTextStream(ForReading)
' Read the file line by line, printing the results to the Form
Do While Not fsoStream.AtEndOfStream
strLine = fsoStream.ReadLine
Debug.Print strLine
Loop
fsoStream.Close
Set fsoStream = Nothing
Set f = Nothing
Set fso = Nothing |
|
Example Programs
The following examples all use the FSO Object.
- Listing subdirectories Recursively
- Setting Attributes
- Loading subdirectories into the TreeView control
- List subdirectories recursively
The following example iterates through directories recursively
writing the name to a MultiLine TextBox. The number of directories
found and the total size is written as a summary at the end.
|
Option Explicit
Private Sub dirFiles_Change()
Dim fso As New FileSystemObject,
startFolder As Folder
Dim numFolders As Integer
Dim strStart As String, strSummary
As String
strStart = dirFiles.Path
' Avoid root directories as it's
likely to run out of memory
If Len(dirFiles.Path) > 3 Then
txtDisplay.Text
= ""
Set
startFolder = fso.GetFolder(strStart)
numFolders
= displayFolder(strStart, True)
strSummary
= numFolders & " Folders, "
strSummary
= strSummary & "Total size: " & Format(startFolder.Size,
"#,##0")
txtDisplay.Text
= txtDisplay.Text & vbCrLf & strSummary
Else
txtDisplay.Text
= ""
End If
Set startFolder = Nothing
Set fso = Nothing
End Sub
Private Function displayFolder(ByVal folderName As String, ByVal
firstTime As Boolean) As Integer
Dim fso As New FileSystemObject
Dim rootFolder As Folder, currentFolder
As Folder, subFolder As Folder
Static folderCount As Integer
Set rootFolder = fso.GetFolder(folderName)
If firstTime = True Then
folderCount
= 0
End If
txtDisplay.Text = txtDisplay.Text
& rootFolder & vbCrLf
folderCount = folderCount + 1
For Each currentFolder In rootFolder.SubFolders
txtDisplay.Text
= txtDisplay.Text & currentFolder & vbCrLf
folderCount
= folderCount + 1
For
Each subFolder In currentFolder.SubFolders
folderCount
= folderCount + displayFolder(subFolder.Path, True)
Next
subFolder
Next currentFolder
displayFolder = folderCount
Set rootFolder = Nothing
Set fso = Nothing
End Function |
|
SETTING ATTRIBUTES:
The following example sets the file attributes for all
files meeting a specified file pattern in a directory.
|
Option Explicit
Private Sub cmdAttributes_Click()
Dim fso As New FileSystemObject
Dim f As File
Dim counter As Integer, attValue
As Integer
For counter = 0 To filList.ListCount
- 1
Set
f = fso.GetFile(filList.Path & "\" & filList.List(counter))
attValue
= 0
If
chkAttributes(0).Value = 1 Then
attValue
= 32
End
If
If
chkAttributes(1).Value = 1 Then
attValue
= 1
End
If
If
chkAttributes(2).Value = 1 Then
attValue
= 2
End
If
f.Attributes
= attValue
Next counter
End Sub
Private Sub dirList_Change()
filList.Path = dirList.Path
End Sub
Private Sub drvDrive_Change()
On Error GoTo driveError
retryDrive:
dirList.Path = drvDrive.Drive
Exit Sub
driveError:
Dim response As Integer, description
As Integer
description = vbExclamation +
vbRetryCancel
response = MsgBox(Err.description,
description, "Drive Error")
If response = vbRetry Then
Resume
retryDrive
End If
End Sub
Private Sub txtPattern_GotFocus()
txtPattern.SelStart = 0
txtPattern.SelLength = Len(txtPattern.Text)
End Sub
Private Sub txtPattern_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
KeyAscii
= 0
filList.Pattern
= txtPattern.Text
End If
End Sub |
|
Loading subdirectories into the TreeView control
The following example lists all of the directories in
the C Drive in a TreeView control. When the "Select Files"
CommandButton is clicked, the nodes with a check in them are added
to the Selection TextBox.
|
Option Explicit
Private Sub cmdSelect_Click()
Dim x As Node
txtSelection.Text = ""
For Each x In tvwFileSystem.Nodes
If
x.Checked Then
txtSelection.Text
= txtSelection.Text & x.Key & vbCrLf
End
If
Next x
End Sub
Private Sub Form_Activate()
Dim fso As New FileSystemObject,
startFolder As Folder, subFolder As Folder
tvwFileSystem.ImageList = imlImages
tvwFileSystem.Checkboxes = True
Set startFolder = fso.GetFolder("C:\")
For Each subFolder In startFolder.SubFolders
addFolder
CStr(subFolder)
Next subFolder
End Sub
Private Sub tvwFileSystem_Collapse(ByVal Node As MSComctlLib.Node)
Node.Image = "closed"
End Sub
Private Sub tvwFileSystem_Expand(ByVal Node As MSComctlLib.Node)
Node.Image = "open"
End Sub
Private Sub addFolder(ByVal folderName As String)
Dim fso As New FileSystemObject
Dim rootFolder As Folder, currentFolder
As Folder, subFolder As Folder
Dim strParentName As String
Set rootFolder = fso.GetFolder(folderName)
If Not rootFolder.IsRootFolder
Then
strParentName
= rootFolder.ParentFolder
If
Len(strParentName) > 3 Then
tvwFileSystem.Nodes.Add
strParentName, tvwChild, rootFolder, rootFolder.Name, closed"
Else
tvwFileSystem.Nodes.Add
, tvwNext, rootFolder, rootFolder.Name, "closed"
End
If
End If
For Each currentFolder In rootFolder.SubFolders
tvwFileSystem.Nodes.Add
CStr(rootFolder), tvwChild, currentFolder, currentFolder.Name,
"closed"
For
Each subFolder In currentFolder.SubFolders
addFolder
subFolder.Path
Next
subFolder
Next currentFolder
End Sub |
|
RANDOM ACCESS FILES:
Visual Basic uses fixed length records in order to implement
random access files. Data may be inserted into the file without
destroying any other data in the file. Data may also be amended
or deleted without having to rewrite the entire file, which is the
case with sequential files.
USER DEFINED TYPES:
A user defined type is a collection of variables that create a
new type, which may be thought of as a record. They are commonly
used to define fixed length records that may be used in random access
files.
The following is an example of a user defined type in
Visual Basic.
|
Private Type clientRecord
accountNumber As Integer
strSurname As String * 15
strForename As String * 15
balance As Currency
End Type |
|
The variables declared within the type are members of the type.
String variables are given a fixed length in order that the record
is a fixed length. Members of the record are accessed using the dot
operator as in the following example. |
Dim cr As clientRecord
cr.accountNumber = 100
Debug.Print cr.accountNumber |
|
Note: Fixed length strings are not supported in VB.Net.
OPENING RANDOM ACCESS FILES:
Random access files may be opened as "read only",
"write only" or "read and write".
If no mode is specified, the default is read and write.
|
Open filename For Random Access Read Write
As #1 Len = recordLength |
|
The As clause specifies a file number that will be used
as a handle to reference the file. The FreeFile can be used
to get the next free file number.
|
Dim fileNum As Integer
fileNum = FreeFile
Open filename For Random As #fileNum Len = recordLength |
|
Reading and Writing to Random Access Files
Get is used to read a record a record from a text file into
a user defined record, and Put is used to write a user defined
record to a file. The Get function takes as parameters the
file handle, the record number, and the user defined record.
The following example gets record 8 from file handle 1
and places it in a user defined record.
|
|
The Put function takes as parameters the file handle, the
record number, and the user defined type.
The following example write the data stored in the user
defined type to record 4 from file handle 1.
|
|
RANDOM ACCESS FILE EXAMPLE
The following example uses a user-defined type for a random
access file. If the file does not exist, 100 blank records are written
to the file.
|
Option Explicit
Private Type clientRecord
accountNumber As Integer
strSurname As String * 15
strForename As String * 15
balance As Currency
End Type
Private Sub Form_Activate()
Dim strFilename As String
Dim recordLength As Long
Dim cr As clientRecord
recordLength = LenB(cr)
On Error GoTo userCancelled
cdlOpen.CancelError = True
' Get a valid filename
Do
cdlOpen.ShowOpen
strFilename
= cdlOpen.filename
Loop While cdlOpen.FileTitle =
""
' Open the file for read and write
Open strFilename For Random Access
Read Write As #1 Len = recordLength
Get #1, 1, cr
If cr.accountNumber = 0 Then
initialiseFile
End If
populateFields 1
Exit Sub
userCancelled:
' The user chose to cancel, so
end the program
End
End Sub
Private Sub cmdFirst_Click()
updateRecord
populateFields 1
End Sub
Private Sub cmdLast_Click()
updateRecord
populateFields 100
End Sub
Private Sub cmdNext_Click()
If Val(lblAccountNumber.Caption)
< 100 Then
updateRecord
populateFields
Val(lblAccountNumber.Caption + 1)
Else
MsgBox
"At last record", vbInformation, "Random Access
Files"
End If
End Sub
Private Sub cmdPrevious_Click()
If Val(lblAccountNumber.Caption)
> 1 Then
updateRecord
populateFields
Val(lblAccountNumber.Caption - 1)
Else
MsgBox
"At first record", vbInformation, "Random Access
Files"
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim response As Integer
response = MsgBox("Are you
sure", vbQuestion + vbYesNo, "Exit Program")
If response = vbNo Then
Cancel
= True
Else
updateRecord
Close
#1
End If
End Sub
Private Sub initialiseFile()
Dim counter As Integer
Dim blankRecord As clientRecord
' write 100 blank records to the
file
For counter = 1 To 100
blankRecord.accountNumber
= counter
Put
#1, counter, blankRecord
Next counter
MsgBox "File initialised",
vbInformation, "Random Access Files"
End Sub
Private Sub populateFields(ByVal recNo As Integer)
Dim cr As clientRecord
Get #1, recNo, cr
lblAccountNumber.Caption = cr.accountNumber
txtForename.Text = cr.strForename
txtSurname.Text = cr.strSurname
txtBalance.Text = cr.balance
txtForename.SetFocus
End Sub
Private Sub updateRecord()
Dim cr As clientRecord
cr.accountNumber = Val(lblAccountNumber.Caption)
cr.strForename = txtForename.Text
cr.strSurname = txtSurname.Text
cr.balance = Val(txtBalance.Text)
Put #1, Val(lblAccountNumber.Caption),
cr
End Sub
Private Sub txtBalance_GotFocus()
txtBalance.SelStart = 0
txtBalance.SelLength = Len(Trim(txtBalance.Text))
End Sub
Private Sub txtForename_GotFocus()
txtForename.SelStart = 0
txtForename.SelLength = Len(Trim(txtForename.Text))
End Sub
Private Sub txtSurname_GotFocus()
txtSurname.SelStart = 0
txtSurname.SelLength = Len(Trim(txtSurname.Text))
End Sub |
|
If you don't find what you are looking for. Please click
here to submit your query, our experts will reply soon.
|