AfraLisp Blog

The AutoLisp/Visual Lisp/VBA Resource Website

AfraLisp Blog

Home Newsletter Utter Rubbish Coding Tips AutoCAD Tips Contact Downloads WAUN

File Functions in Visual Basic

Dir

One useful file function is the Dir$ function. This function works like the Dir command at an MS-DOS command prompt. You can use the Dir$ function to retrieve a list of one or more operating system files that match a file specification or path. A path can include the name of a directory, a specific file name, or both. For example, C:/*.DWG is the path to all the files in the
root directory of drive C having a DWG extension. The syntax of the Dir$ function is as follows :

stringvar = Dir$(path[,attributes])

Finding Files

One use of the Dir$ function is to determine whether a file exists. If you try to open a database or access a file that does not exist, an error occurs. However, you can use Dir$ first to check for a files existence before opening it, as in the following example :

If Dir$("C:/MYFILE.DWG" = " " Then
Msgbox "The file was not found. Please try again!"
End If
The Dir$ function returns the filename without the full path if the specified file is found, or it returns an empty string if no files were found. The preceding line of code displays a message box if MYFILE.DWG does not exist in the root directory of drive C. If the file does exist, the string "myfile.dwg" is returned. To make things even simpler, you can create a generic function that returns a Boolean value "True" if the given file exists.
Public Function bFileExists (Sfile As String) As Boolean

If Dir$(sFile) <> " " Then
	bFileExists = True
Else
	bFileExists = False
End Function

This function could then be used to check any filename passed to the program by the user, as in the following example :

Dim sUserFile As String

sUserFile = InputBox$("Enter the File Name : ")

If Not bFileExists(sUserFile) Then
	MsgBox "The file does not exist. Please try again."
	End
End If

Notice that the code sample ends the program if the file does not exist, to prevent any errors that might occur later. Another way to handle this situation would be to keep asking the user for a filename until a valid filename is entered.


Listing Files and Folders

Another use of the Dir$ function is to return a list of files in the specified path. If you use the Dir command at an MS DOS prompt, each matching file is listed
on the screen. However, because the Dir$ function is designed to return only a single string variable, you have to use a loop and retrieve one filename at a time. (You can also display a list of files with a file list box, which is one of Visual Basic's default controls.

Suppose that your C:/DRAWINGS directory contains several drawings with a DWG extension. The path used to retrieve these files with the Dir$ function would be C:/DRAWINGS/*.DWG. You can use the following lines of code to retrieve the filenames and add them to a list box :

sNextFile As String

sNextFile = Dir$("C:/DRAWINGS/*.DWG")

While sNextFile <> " "
	lstDwgList.AddItem sNextFile
	sNextFile = Dir$
Wend

In the preceding example, notice that only the file path to Dir$ is supplied on the first call. Each subsequent call to Dir$ has no arguments, indicating that you want to use the previous file path and move to the next filename in the list. When no more files match, Dir$ returns an empty string and the "While" loop terminates.

Caution : When you use Dir$ in a loop, always exit the loop after an empty string is returned. If you try to make another call to Dir$ with no arguments, a runtime error occurs.

The second, optional parameter of the Dir$ function is used to provide additional conditions (beyond the specified path) with which to select files. For example, using the constant "vbDirectory" returns only the subdirectories (or folders) in the specified path. The constant "vbVolume" causes Dir$ to return the specified drive's volume label. The available constants are
summarized below : 

Constant Value Purpose
vbNormal  0 (Default Value)
vbHidden  2 Include Hidden Files
vbSystem 4 Include System Files
vbVolume 8 Return Drive Volume Label
vbDirectory 16 Display SubDirectories
vbReadOnly 1 Include read-only files

Note : Constants can be added together if you want to use more than one. For example, the following code finds the system, hidden and read only file IO.SYS on a machine :

debug.Print Dir$("C:/IO.SYS" , vbHidden+vbSystem+vbReadOnly)

Note that the "vbHidden" constant refers to a file's attributes and not the Windows Explorer option that hides certain file types.


File Manipulation Functions

As with the Dir$ function, most of the file manipulation commands in Visual Basic are as straightforward as their MS-DOS equivalents, although with a few limitations. These commands are summarised below :

Copy a File FileCopy source dest
Delete one or more Files Kill path
Rename a File Name oldname As newname
Create a Folder MkDir pathname
Remove an empty Folder RemDir pathname
Change current directory ChDir pathname
Change current drive ChDrive drive

Several of these functions are described in the following sections :

Copying Files

The "FileCopy" command has the limitation that you cannot use wildcards to
specify multiple files. "FileCopy" can copy files locally or over a network, as shown in the following example :

'The following line copies a file while changing its name :
FileCopy "D:\DRAWING\TEST.DWG", "C:\BACKUP\TEST-BACK.DWG"

'The following lines of code use a network path for the source file :
Dim sDest As String
Dim sSource As String

sSource = "\\MYSERVER\DRAWINGS\TEST.DWG"
sDest = "C:\BACKUP\TEST-BACK.DWG"

FileCopy sSource, sDest

The "FileCopy" statement automatically overwrites an existing file, unless the
file is read-only or locked open by another application.

Deleting Files

Visual Basic also allows you to delete files by using the "Kill" statement. "Kill"
can use wildcards to specify multiple files, as in the following example :

Kill "D:\DRAWINGS\*.DWG"

Renaming Files

The "Name" statement is like the MS-DOS "RENAME" command but can be used on only one file at a time "

Name oldname As newname

You can also use "Name" like the "MOVE" command in MS-DOS if the specified paths are different :

'Moves the files to a new directory
MkDir "C:\BACKUP\TEST-BACK.DWG"
Name "D:\DRAWING\TEST.DWG" As "C:\BACKUP\TEST-BACK.DWG"

In the preceding example,note the "MkDir" statement, which you have probably guessed is used to create a new directory. The "MkDir" and "RemDir" statements add and remove directories.

Setting the Current Directory

In the examples discussed so far, the path has always included the drive and directory. However, as you may recall from using MS-DOS, during the context of your MS-DOS session, you are always "in" a certain directory, which is usually displayed to the left of the MS-DOS cursor. For example, if you type CD \WINDOWS, you can rename, copy, or delete files within the WINDOWS directory without specifying C:\WINDOWS in the pathname. The same concept of a "current directory" applies to Visual Basic. By using the "ChDir" and "ChDrive" statements, you can set the current working directory on each drive and switch between current drives, eliminating the need to specify the full path for each file operation :

'Change to the desired directory and drive and rename file
ChDir "C:\DRAWINGS"
ChDrive "C:"
Name "TEST1.DWG" As "TEST2.DWG"

'Delete a file in the current directory
ChDrive "D:"
ChDir "D:\DRAWINGS"
Kill "OLDTEST.DWG"

Performing deletes can be dangerous if you don't know the current directory. Fortunately, Visual Basic offers a function that provides this value: the "CurDir" function. The syntax of "CurDir" is :

stringvar = CurDir$([Drive])

Note - You can use the "Left$" function to get the current drive letter, as in the
following example :

sDriveLetter = Left$(CurDir$( ) , 1)

Okay, let's put this all together into a practical example.
Wouldn't it be nice to be able to backup all your drawings from your working
directory into a backup directory, either on another drive or to the network.
Have a look at this wee application, remembering to change the directory
paths to suit your own.

Open a new module and copy and paste this coding :

'VBA CODING STARTS HERE

Option Explicit

Sub Backup()

Dim sSourceDir As String
Dim sBackDir As String
Dim sNextFile As String

On Error GoTo FileCopyError

'Change these paths to suit. 
sSourceDir = "C:\DRAWINGS\"
sBackDir = "D:\BACKUP\"

sNextFile = Dir$(sSourceDir & "*.DWG")

While sNextFile <> ""
	FileCopy sSourceDir & sNextFile, sBackDir & sNextFile
	sNextFile = Dir$
Wend

MsgBox "Drawing Backup Complete. Have a Nice Day."

Exit Sub

FileCopyError:
MsgBox "There was a problem copying the Drawings"
End

End Sub

'VBA CODING ENDS HERE
 
The AutoLisp/Visual Lisp/VBA Resource Website

Copyright © 1999-Perpetuity by AfraLisp

All rights reserved.
Information in this document is subject to change without notice.
Site created and maintained by Kenny Ramage

The AutoLisp/Visual Lisp/VBA Resource Website