VB's File System Commands and Functions

 

VB provides a set of statements that perform DOS-like (or Windows command line-like) commands.  These commands are listed and described in the table below:

 

VB Statement

Equivalent DOS/Windows Command Line Command

 

Description

 

Syntax

MkDir

MKDIR or MD

Creates (makes) a directory

MkDir pathname

RmDir

RMDIR or RD

Removes (deletes) a directory

RmDir pathname

ChDrive

drive:

 (like typing A: on the command line)

Changes the current drive

ChDrive drive

ChDir

CHDIR or CD

Changes the current directory

ChDir drive

Kill

ERASE or DEL

Deletes a file

Kill filespec

Name

RENAME or REN

Renames a file

Name oldfilespec As newfilespec

FileCopy

COPY

Copies a file

FileCopy oldfilespec, newfilespec

 

In the syntax above, pathname is a string expression specifying a valid path (it may optionally include the drive); drive is a string expression specifying a drive letter; and filespec, oldfilespec, and newfilespec are string expressions that specify a file (they may optionally include the drive and path).

 

Following is a set of functions that can be used with files (all are functions except SetAttr, which is a statement):

 

Function

Description

Syntax

FileDateTime

Returns a date/time value indicating the date and time that a file was created or last modified.

FileDateTime(filespec)

GetAttr

Returns an integer representing the attributes of a file, directory, or folder

GetAttr(filespec)

SetAttr

Statement that lets you specify the attributes for a file

SetAttr(filespec, attributes)

CurDir$ (or CurDir)

Returns a string that indicates the current path for a specified disk drive. In the syntax on the right, drivename is a string expression that specifies a valid disk drive designation

CurDir$(drivename)

Dir$ (or DIr)

Returns a string that indicates a file or directory matching specified conditions

Dir$(filespec [,attributes])

FileLen

Returns a Long specifying the length of a file in bytes. If the specified file is open when the FileLen function is called, the value returned represents the size of the file immediately before it was opened.

FileLen(pathname)

LOF

Returns a Long representing the size, in bytes, of a file opened using the Open statement.

FileLen(filenumber)

 

The return value of GetAttr and the attributes argument of SetAttr and Dir$ can have any of the following values (not all values are valid for all functions):

 

Constant

Value

vbNormal

0

vbReadOnly

1

vbHidden

2

VbSystem

4

vbVolume

8

vbDirectory

16

vbArchive

32

 

Common Uses of the Dir$ Function

 

The Dir$ function is commonly used to test for the existence of a particular file, test for the existence of a particular directory (folder), and to generate a list of files contained in a particular directory.

 

To see if a particular file exists, use that filename as the argument to the Dir$ function. If the result is the empty string (""), then the file does NOT exist – otherwise, it does:

 

If DIr$("C:\SomeFolder\MyFile.txt") = "" Then

    Msgbox "File does not exist."

Else

    Msgbox "File exists."

End If

 

To see if a particular directory (folder) exists, use that directory path as the first argument to the Dir$ function, and the vbDirectory attribute as the second argument. If the result is the zero-length string (""), then the directory does NOT exist – otherwise, it does:

 

If DIr$("C:\SomeFolder", vbDirectory) = "" Then

    Msgbox "Directory does not exist."

Else

    Msgbox " Directory exists."

End If

 

To generate a list of files contained in a particular directory, you use a path/filename specification with a wildcard as the argument in an initial call to Dir$; then you make repeated calls to Dir$ with no argument until Dir$ returns an zero-length string (""). This can be accomplished with the following code:

 

Dim strCurrentFile As String

 

strCurrentFile = Dir$("C:\SomeDir\*.txt")

Do Until strCurrentFile = ""

    Print strCurrentFile

    strCurrentFile = Dir$()

Loop

 

 

Sample Program

 

As a vehicle to demonstrate commonly used file system commands and functions, the tasks in a student exercise to practice MS-DOS commands has become the work to be done by the sample program.

 

Let us take a look at the original student exercise. The students were given a floppy disk containing the following files, all in the root directory:

 

 

The students were instructed to make six directories on their disk and move the indicated files to their proper directory as shown below. When done with this step, there should be NO files in the root directory.

 

Create a directory called:

For files with these extensions:

SYSTEM

.SYS

COMMAND

.COM

EXECUTE

.EXE

INITIAL

.INI

TEXT

.TXT

WRITE

.WRI

 

To do this step they would have to do the following:

 

First, make the directories:

 

      MD SYSTEM

      MD COMMAND

      MD EXECUTE

      MD INITIAL

      MD TEXT

      MD WRITE

 

Next, they would have to move the appropriate set of files from the root to the proper directory. This could be accomplished with either a set of MOVE commands or a set of COPY and DELETE combinations:

 

      MOVE A:\*.SYS A:\SYSTEM

      MOVE A:\*.COM A:\COMMAND

      MOVE A:\*.EXE A:\EXECUTE

      MOVE A:\*.INI A:\INITIAL

      MOVE A:\*.TXT A:\TEXT

      MOVE A:\*.WRI A:\WRITE

 

               - or -

 

      COPY A:\*.SYS A:\SYSTEM

      DEL A:\*.SYS

      COPY A:\*.COM A:\COMMAND

      DEL A:\*.COM

      COPY A:\*.EXE A:\EXECUTE

      DEL A:\*.EXE

      COPY A:\*.INI A:\INITIAL

      DEL A:\*.INI

      COPY A:\*.TXT A:\TEXT

      DEL A:\*.TXT

      COPY A:\*.WRI A:\WRITE

      DEL A:\*.WRI

 

For the last step, they were instructed as follows:

 

Below the SYSTEM subdirectory, create a directory called EXE_INI.  Place copies of the .EXE and .INI files there. Below the INITIAL subdirectory, create a directory call TXT_WRI.  Place copies of the .TXT and .WRI files there.

 

To do this, they would have to issue the following commands:

 

      MD A:\SYSTEM\EXE_INI

      COPY A:\EXECUTE\*.EXE A:\SYSTEM\EXE_INI

      COPY A:\INITIAL\*.INI A:\SYSTEM\EXE_INI

 

      MD A:\INITIAL\TXT_WRI

      COPY A:\TEXT\*.TXT A:\INITIAL\TXT_WRI

      COPY A:\WRITE\*.INI A:\ INITIAL\TXT_WRI

 

The student would then turn their disk into the instructor, who would check to make sure that all the proper directories were created and that the files were in the right place.

 

As a follow-up exercise, students were given the disks back and asked to restore the disk back to its original state – i.e., all files back in the root with no subdirectories.

 

To do this, they would have to move the *.SYS, *.COM, *.EXE, *.INI, *.TXT, and *.WRI files from their respective top-level directories back to the root. This could be accomplished with the following MS-DOS (Windows command-line) commands:

 

      MOVE A:\SYSTEM\*.* A:\

      MOVE A:\COMMAND\*.* A:\

      MOVE A:\EXECUTE\*.* A:\

      MOVE A:\INITIAL\*.* A:\

      MOVE A:\TEXT\*.* A:\

      MOVE A:\WRITE\*.* A:\

 

At this point, the COMMAND, EXECUTE, TEXT, and WRITE subdirectories are cleared out, so they could be removed with the "remove directory" command (RMDIR or RD) as follows:

 

      RD A:\COMMAND

      RD A:\EXECUTE

      RD A:\TEXT

      RD A:\WRITE

 

However, since second-level directories were created below both the SYSTEM and the INITIAL directories, those directories must be cleared out before they can be removed (the RD command will only work if the directory to be removed is empty).

 

Therefore, the files in the EXE_INI directory below the SYSTEM directory must be deleted:

 

      DEL A:\SYSTEM\EXE_INI\*.*

 

Then the EXE_INI directory can be removed:

 

      RD A:\SYSTEM\EXE_INI

 

Then the top-level SYSTEM directory can be removed:

 

      RD A:\SYSTEM

 

A similar set of commands is necessary to clear the INITIAL directory:

 

      DEL A:\INITIAL\TXT_WRI\*.*

      RD A:\INITIAL\TXT_WRI

      RD A:\INITIAL

 

At this point, the exercise would be complete and the disk could be turned back into the instructor.

 

To do the sample project that implements these actions, you need a "clean" (empty) floppy disk. The sample files shown above (the .SYS, .INI, etc.) should then be copied to that disk. The project download below, when unzipped, contains a folder called "FileSysDemoFiles", from where the files can be copied. (As an alternative, you can simply make empty files using Notepad and save them with those names, and then copy them to a floppy. For the purpose of this exercise, the content of these files do not matter; for example, the "exe" and "com" files need not be valid executables.)

 

The sample project is a modified "Try It" program. The "Clear" button was changed to "Reset" (the caption was changed "Reset" and the name was changed to "cmdReset").

 

 

The "Try It" button implements the first part of the exercise (makes the subdirectories and moves and copies the files to their proper locations). The "Reset" button implements the second part of the exercise (puts all files back to the root directory and removes all of the subdirectories).

 

The cmdTryIt_Click code, as well as a Sub called CopyOrMoveFiles (to facilitate the copying and moving of files) is shown below. The code is heavily commented to aid in the understanding of what the code is doing.

 

You will notice that two statements, "DoEvents" and "Refresh"  are used throughout the procedure.

 

The DoEvents statement "yields execution so that the operating system can process other events". DoEvents is typically used to break up processor-intensive operations (such as all the I/O this program is doing) so that the system does not appear to freeze up and so that you can do other things (such as run another program) while the VB program is running.

 

"Refresh" is actually a method of the form and could have been coded as "Me.Refresh" or "frmTest.Refresh". The Refresh method forces the form to repaint itself. The Refresh method was used to ensure that each "Print" message is displayed at the desired time (during processor-intensive operations, the form does not always automatically repaint itself when we want it to).

 

Private Sub cmdTryIt_Click()

   

    On Error GoTo cmdTryIt_Click_Error

   

    Cls

   

    ' Make the top-level subdirectories below the root with the MkDir statement ...

    MkDir "A:\SYSTEM"

    MkDir "A:\COMMAND"

    MkDir "A:\EXECUTE"

    MkDir "A:\INITIAL"

    MkDir "A:\TEXT"

    MkDir "A:\WRITE"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "Top-level directories have been made."

    Refresh

   

    ' To faciliate the moving of the files to their proper directories, a Sub named

    ' CopyOrMoveFiles was written. The Sub takes four arguments: (1) source path,

    ' (2) target path, (3) file extension, and (4) a one-character code indicating

    ' whether the files should be moved ("M") or copied ("C"). The Sub is called six

    ' times, once for each file type to be moved from the root to its proper directory. 

    CopyOrMoveFiles "A:\", "A:\SYSTEM", "SYS", "M"

    CopyOrMoveFiles "A:\", "A:\COMMAND", "COM", "M"

    CopyOrMoveFiles "A:\", "A:\EXECUTE", "EXE", "M"

    CopyOrMoveFiles "A:\", "A:\INITIAL", "INI", "M"

    CopyOrMoveFiles "A:\", "A:\TEXT", "TXT", "M"

    CopyOrMoveFiles "A:\", "A:\WRITE", "WRI", "M"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "Files have been moved from root to top-level directories."

    Refresh

   

    ' Create the EXE_INI directory below the SYSTEM directory with MkDir ...

    MkDir "A:\SYSTEM\EXE_INI"

    Print "Second-level directory for EXE and INI files has been made."

    ' Use the "CopyOrMoveFiles" Sub to copy the EXEs and INIs to the

    ' newly-created directory ...

    CopyOrMoveFiles "A:\EXECUTE", "A:\SYSTEM\EXE_INI", "EXE", "C"

    CopyOrMoveFiles "A:\INITIAL", "A:\SYSTEM\EXE_INI", "INI", "C"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "Files have been copied to EXE_INI directory."

    Refresh

 

    ' Create the TXT_WRI directory below the INITIAL directory with MkDir ...

    MkDir "A:\INITIAL\TXT_WRI"

    Print "Second-level directory for TXT and WRI files has been made."

    ' Use the "CopyOrMoveFiles" Sub to copy the TXTs and WRIs to the

    ' newly-created directory ...

    CopyOrMoveFiles "A:\TEXT", "A:\INITIAL\TXT_WRI", "TXT", "C"

    CopyOrMoveFiles "A:\WRITE", "A:\INITIAL\TXT_WRI", "WRI", "C"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "Files have been copied to TXT_WRI directory."

    Refresh

   

    Print "Done."

 

    Exit Sub

 

cmdTryIt_Click_Error:

   

    MsgBox "The following error has occurred:" & vbNewLine _

         & "Error # " & Err.Number & " - " & Err.Description, _

           vbCritical, _

           "File System Commands Demo - Error"

 

End Sub

 

 

Private Sub CopyOrMoveFiles(pstrSourcePath As String, _

                            pstrTargetPath As String, _

                            pstrExtension As String, _

                            pstrCopyOrMoveCode As String)

 

' This Sub takes four arguments: (1) source path, (2) target path, (3) file extension,

' and (4) a one-character code indicating whether the files should be moved ("M") or

' copied ("C").

 

    Dim strCurrentFile  As String

    Dim strPattern      As String

    Dim strSourceFile   As String

    Dim strTargetFile   As String

   

    ' If the source path does not already have a backslash at

    ' the end of it, add one ...

    If Right$(pstrSourcePath, 1) <> "\" Then

        pstrSourcePath = pstrSourcePath & "\"

    End If

 

    ' If the target path does not already have a backslash at

    ' the end of it, add one ...   

    If Right$(pstrTargetPath, 1) <> "\" Then

        pstrTargetPath = pstrTargetPath & "\"

    End If

   

    ' Create the "source pattern" by concatenating the source path, "*.", and

    ' the extension. For example, if "A:\" was passed in as the source path and

    ' "SYS" was passed in as the extension, the value of strPattern would be

    ' "A:\*.SYS". 

    strPattern = pstrSourcePath & "*." & pstrExtension

 

    ' Use the pattern created above as the initial argument to the Dir$ function.

    ' The strCurrentFile variable will be used to hold the matching files (one at

    ' a time, as returned by successive calls to the Dir$ function).   

    strCurrentFile = Dir$(strPattern)

   

    ' Set up a loop to copy the matching files from the source path to the target

    ' path. The loop will stop when there are no more matching files.

    Do Until strCurrentFile = ""

        ' Create the source file name that will be used in the FileCopy statement

        ' by concatenating the source path with the filename last returned by the

        ' Dir$ function. For example, if the source path was "A:\", and the current

        ' filename returned by Dir$ was "TESTSYS1.SYS", then the value of strSourceFile

        ' would be "A:\TESTSYS1.SYS".

        strSourceFile = pstrSourcePath & strCurrentFile

        ' Create the target file name that will be used in the FileCopy statement

        ' by concatenating the target path with the filename last returned by the

        ' Dir$ function. For example, if the target path was "A:\SYSTEM\", and the

        ' current filename returned by Dir$ was "TESTSYS1.SYS", then the value of

        '  strTargetFile would be "A:\SYSTEM\TESTSYS1.SYS".

        strTargetFile = pstrTargetPath & strCurrentFile

        ' Use FileCopy to copy the source file to its target destination ...

        FileCopy strSourceFile, strTargetFile

        ' Get the next matching file by calling the Dir$ function with no arguments.

        strCurrentFile = Dir$()

    Loop

   

    ' If the "Copy or Move code" passed in was "M" (for move), then we need to delete

    ' the files that we just copied to a new location. Since the native VB file I/O

    ' statements do not include a "move file" statement specifically, a move must be

    ' be accomplished by first copying a file to its new destination, then deleting it

    ' from its original location. The Kill statement is used to delete one or more files

    ' (it will accept a file specification that uses a pattern). For example, if the

    ' variable strPattern contained "A:\*.SYS", the Kill statement below would be

    ' equivalent to the MS-DOS/Windows command-line command "DEL A:\*.SYS".

    If pstrCopyOrMoveCode = "M" Then

        Kill strPattern

    End If

   

End Sub

 

After the cmdTryIt_Click event procedure has run, the form should look like this:

 

 

 

The cmdReset_Click code, which implements the follow-up part of the student exercise (to restore the disk back to its original state – i.e., all files back in the root with no subdirectories) is shown below. The code is heavily commented to aid in the understanding of what the code is doing.

 

Private Sub cmdReset_Click()

   

    On Error GoTo cmdReset_Click_Error

   

    Cls

   

    ' Delete all of the files in the EXE_INI directory below the SYSTEM directory ...

    Kill "A:\SYSTEM\EXE_INI\*.*"

    ' Now that the EXE_INI directory is clear, remove it with RmDir

    RmDir "A:\SYSTEM\EXE_INI"

    ' Use the CopyOrMoveFiles Sub to move the SYS files from the SYSTEM directory

    ' back to the root ...

    CopyOrMoveFiles "A:\SYSTEM", "A:\", "SYS", "M"

    ' Moving the SYS files out of the SYSTEM directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\SYSTEM\"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "SYSTEM directory has been cleared; files moved back to root."

    Refresh

 

    ' Use the CopyOrMoveFiles Sub to move the COM files from the COMMAND directory

    ' back to the root ...    

    CopyOrMoveFiles "A:\COMMAND", "A:\", "COM", "M"

    ' Moving the COM files out of the COMMAND directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\COMMAND"

   

    ' Free up the OS for a sec and ensure message is displayed ...

    DoEvents

    Print "COMMAND directory has been cleared; files moved back to root."

    Refresh

   

    ' Use the CopyOrMoveFiles Sub to move the EXE files from the EXECUTE directory

    ' back to the root ...

    CopyOrMoveFiles "A:\EXECUTE", "A:\", "EXE", "M"

    ' Moving the EXE files out of the EXECUTE directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\EXECUTE"

 

    ' Free up the OS for a sec and ensure message is displayed ...       

    DoEvents

    Print "EXECUTE directory has been cleared; files moved back to root."

    Refresh

   

   ' Delete all of the files in the TXT_WRI directory below the INITIAL directory ...

    Kill "A:\INITIAL\TXT_WRI\*.*"

    ' Now that the TXT_WRI directory is clear, remove it with RmDir

    RmDir "A:\INITIAL\TXT_WRI"

    ' Use the CopyOrMoveFiles Sub to move the INI files from the INITIAL directory

    ' back to the root ...

    CopyOrMoveFiles "A:\INITIAL", "A:\", "INI", "M"

    ' Moving the INI files out of the INITIAL directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\INITIAL"

 

    ' Free up the OS for a sec and ensure message is displayed ...   

    DoEvents

    Print "INITIAL directory has been cleared; files moved back to root."

    Refresh

   

    ' Use the CopyOrMoveFiles Sub to move the TXT files from the TEXT directory

    ' back to the root ...

    CopyOrMoveFiles "A:\TEXT", "A:\", "TXT", "M"

    ' Moving the TXT files out of the TEXT directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\TEXT"

 

    ' Free up the OS for a sec and ensure message is displayed ...   

    DoEvents

    Print "TEXT directory has been cleared; files moved back to root."

    Refresh

   

    ' Use the CopyOrMoveFiles Sub to move the WRI files from the WRITE directory

    ' back to the root ...

    CopyOrMoveFiles "A:\WRITE", "A:\", "WRI", "M"

    ' Moving the WRI files out of the WRITE directory should have cleared it, so

    ' it now can be removed with RmDir ...

    RmDir "A:\WRITE"

   

    ' Free up the OS for a sec and ensure message is displayed ...   

    DoEvents

    Print "WRITE directory has been cleared; files moved back to root."

    Print "Done."

    Refresh

   

    Exit Sub

 

cmdReset_Click_Error:

   

    MsgBox "The following error has occurred:" & vbNewLine _

         & "Error # " & Err.Number & " - " & Err.Description, _

           vbCritical, _

           "File System Commands Demo - Error"

   

End Sub

 

After the cmdReset_Click event procedure has run, the form should look like this:

 

 

Download the VB project code for the example above here.