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.

 

Get #1, 8, userRecord

 

 

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.

 

Put #1, 4, userRecord

 

 

 

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.

 

E-mail : sales@virtualsplat.com
Phone : +91-9892413501

Whatsapp Icon +91-9967648641

Whatsapp Icon +91-9967648641