Вы находитесь на странице: 1из 13

File Handling And FSO Object

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. 2. 3. 4. 5. File. Folder. Drive. TextStream. 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 CopyFile CopyFolder CreateFolder CreateTextFile DeleteFile DeleteFolder DriveExists FileExists FolderExists GetAbsolutePathNa me GetDrive GetDriveName GetFile GetFileName GetFolder GetParentFolderNa me GetTempName MoveFile MoveFolder OpenTextFile

Description Used to copy an existing file. Used to copy an existing folder. Used to create a folder. Used to create a text file. Used to delete a file. Used to delete a folder. Used to determine whether a drive exists. Used to determine whether a file exists. Used to determine whether a folder exists. Used to return the full path name. Used to return a specified drive. Used to return the drive name. Used to return a specified file. Used to return the file name. Used to return a specified folder. Used to return the name of the parent folder. Used to create and return a string representing a file name. Used to move a file. Used to move a folder. 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

Else

driveName = drv.ShareName

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()

fso As New FileSystemObject f As File counter As Integer, attValue As Integer 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

Dim Dim Dim For

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.

10

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 =

11

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

12

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

13

Вам также может понравиться