Visual Basic Concepts
Working with Drives and Folders
With the FSO object model you can work with drives and folders programmatically just as you can in the Windows Explorer interactively. You can copy and move folders, get information about drives and folders, and so forth.
Getting Information About Drives
The Drive object allows you to gain information about the various drives attached to a system, either physically or over a network. Its properties allow you to obtain information about:
The total size of the drive in bytes (TotalSize property)
How much space is available on the drive in bytes (AvailableSpace or FreeSpace properties)
What letter is assigned to the drive (DriveLetter****property)
What type of drive it is, such as removable, fixed, network, CD-ROM, or RAM disk (DriveType****property)
The drive's serial number (SerialNumber****property)
The type of file system the drive uses, such as FAT, FAT32, NTFS, and so forth (FileSystem****property)
Whether a drive is available for use (IsReady****property)
The name of the share and/or volume (ShareNameand VolumeNameproperties)
The path or root folder of the drive (Path and RootFolder properties)
Example Usage of the Drive Object
The example below shows how to use the Drive object to gather information about a drive. Remember that you won't see a reference to an actual Drive object in the following code; rather, you use the GetDrive method to get a reference to an existing Drive object (in this case, drv)
:
Private Sub Command3_Click()
Dim fso As New FileSystemObject, drv As Drive, s As String
Set drv = fso.GetDrive(fso.GetDriveName("c:"))
s = "Drive " & UCase("c:") & " - "
s = s & drv.VolumeName & vbCrLf
s = s & "Total Space: " & FormatNumber(drv.TotalSize / 1024, 0)
s = s & " Kb" & vbCrLf
s = s & "Free Space: " & FormatNumber(drv.FreeSpace / 1024, 0)
s = s & " Kb" & vbCrLf
MsgBox s
End Sub
Using CurDir, ChDrive, ChDir, or App.Path
If you use the CurDir function, the ChDrive and ChDir statements, or the Path property (App.Path), be aware that they may return a UNC path (that is, \\Server\Share…) rather than a drive path (such as E:\Folder), depending on how you run your program or project.
App.Path returns a UNC path:
When you run a project after loading it from a network share, even if the network share is mapped to a drive letter.
When you run a compiled executable file from a network share (but only if it is run using a UNC path).
ChDrive cannot handle UNC paths, and thus raises an error when App.Path returns one. You can handle this error by adding On Error Resume Next before the ChDrive statement, or by testing the first two characters of App.Path to see if they are backslashes:
On Error Resume Next
ChDrive App.Path
ChDir App.Path
This modification handles all cases in which the program is started from Windows using a UNC path (for example, in the Run dialog accessed from the Start menu), because Windows sets the current directory to a UNC path. ChDir handles changes between UNC paths correctly. (The failure of ChDrive can be ignored, because there is no drive letter for a UNC path.)
However, the above code above won't work if you run the program by entering a UNC path at MS-DOS command prompt. This is because the command prompt always has a drive path for the current directory, so CurDir is set to a drive path. ChDir does not raise an error, but it fails to change the directory from a drive path to a UNC path. The only workaround for this situation is to locate a local drive that's mapped to the share specified in the UNC path, or to use network commands to create such a mapping.
If the project is loaded into the Visual Basic IDE from a network share – either a UNC path or a mapped drive path – then App.Path returns a UNC path when the project is run and ChDrive fails and raises an error. ChDir doesn't raise an error, but the directory is not changed. The only workaround is to manually set the drive and directory:
Const PROJECTSHARE = "E:\VBPROJ\MYPROJECT"
#Const Debug = True
#If Debug Then
ChDrive PROJECTSHARE
ChDir PROJECTSHARE
#Else
On Error Resume Next
ChDrive App.Path
ChDir App.Path
#End If
If more than one person might open the project on the network share, a DOS environment variable can be used to allow each person to have their own mapping for the share:
#Const Debug = True
#If Debug Then
ChDrive Environ("MYPROJECTDIR")
ChDir Environ("MYPROJECTDIR")
#Else
On Error Resume Next
ChDrive App.Path
ChDir App.Path
#End If
The value of MYPROJECTDIR specifies the mapped drive letter and the path, for example:
SET MYPROJECTDIR=M:\VBProj\MyProject
Working with Folders
This list shows common folder tasks and the methods for doing them:
Task | Method |
Create a folder | FileSystemObject.CreateFolder |
Delete a folder | Folder.Delete or FileSystemObject.DeleteFolder |
Move a folder | Folder.Move or FileSystemObject.MoveFolder |
Copy a folder | Folder.Copy or FileSystemObject.CopyFolder |
Retrieve the name of a folder | Folder.Name |
Find out if a folder exists on a drive | FileSystemObject.FolderExists |
Get an instance of an existing Folder object | FileSystemObject.GetFolder |
Find out the name of a folder's parent folder | FileSystemObject.GetParentFolderName |
Find out the path of system folders | FileSystemObject.GetSpecialFolder |
Example
This example demonstrates usage of the Folder and FileSystemObject objects to manipulate folders and gain information about them:
Private Sub Command10_Click()
' Get instance of FileSystemObject.
Dim fso As New FileSystemObject, fldr As Folder, s As String
' Get Drive object.
Set fldr = fso.GetFolder("c:")
' Print parent folder name.
Debug.Print "Parent folder name is: " & fldr
' Print drive name.
Debug.Print "Contained on drive " & fldr.Drive
' Print root file name.
If fldr.IsRootFolder = True Then
Debug.Print "This folder is a root folder."
Else
Debug.Print "This folder isn't a root folder."
End If
' Create a new folder with the FileSystemObject object.
fso.CreateFolder ("c:\Bogus")
Debug.Print "Created folder C:\Bogus"
' Print the base name of the folder.
Debug.Print "Basename = " & fso.GetBaseName("c:\bogus")
' Get rid of the newly-created folder.
fso.DeleteFolder ("c:\Bogus")
Debug.Print "Deleted folder C:\Bogus"
End Sub