Tip 198: Retrieving File Information in Visual Basic 4.0


December 5, 1995

Abstract
This article explains how, from within a Microsoft® Visual Basic® version
4.0 application, you can retrieve information about a specific file stored
on disk. This information may include the date and time when the file was
initially created, when the file was last accessed, and any number of
other details.

Using the GetFileInformationByHandle Function
In some Microsoft® Visual Basic® version 4.0 applications you write, you
may need to examine certain file information. For example, you may need
to determine when a file was last accessed or the serial number of the
volume that contains the file. This type of information about a file can
be retrieved using the Microsoft Windows® application programming
interface (API) GetFileInformationByHandle function.

To use the GetFileInformationByHandle function, you must include the
following Declare statement in your project:

Declare Function GetFileInformationByHandle Lib "kernel32" (ByVal hFile
   As Long, lpFileInformation As BY_HANDLE_FILE_INFORMATION) As Long

As you can see, this function requires only two arguments: the handle of
the file you want to retrieve information on and the address of a
BY_HANDLE_FILE_INFORMATION structure that will hold the file's
information.

There are several steps you must perform to retrieve information about a
file. First, you must use the Windows API OpenFile function to obtain the
specified file's file handle. Once you have the file handle, you can call
the GetFileInformationByHandle function. The file's information is then
stored in the BY_HANDLE_FILE_INFORMATION structure. Next, you must use
the Windows API CloseHandle function to release the file handle to the
system.

In the example program below, you retrieve the date and time that the file
was actually created. You then use the Windows API FileTimeToSystemTime
function to convert the file's date and time stamp to individual values
that you can use in the program. This same procedure is used to process
the file's last access and last write date and time stamp. In addition,
two other pieces of information are also retrieved about the file the
file's attributes and the volume's serial number.

Example Program
This program shows how to retrieve information about a specific file.

 1. Create a new project in Visual Basic. Form1 is created by default.
 2. From the Visual Basic Insert menu, select Module to create a new
    module. Module1.Bas is created by default.
 3. Add the following code to Module1.Bas (note that each Declare
    statement must be typed as a single line of code):

Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String,
   lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
Declare Function GetFileInformationByHandle Lib "kernel32" (ByVal hFile
   As Long, lpFileInformation As BY_HANDLE_FILE_INFORMATION) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As
FileTime,
   lpSystemTime As SYSTEMTIME) As Long
Public Const OFS_MAXPATHNAME = 128
Public Const OF_READ = &H0

Type OFSTRUCT
        cBytes As Byte
        fFixedDisk As Byte
        nErrCode As Integer
        Reserved1 As Integer
        Reserved2 As Integer
        szPathName(OFS_MAXPATHNAME) As Byte
End Type
Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
End Type
Type FileTime
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type
Type BY_HANDLE_FILE_INFORMATION
        dwFileAttributes As Long
        ftCreationTime As FileTime
        ftLastAccessTime As FileTime
        ftLastWriteTime As FileTime
        dwVolumeSerialNumber As Long
        nFileSizeHigh As Long
        nFileSizeLow As Long
        nNumberOfLinks As Long
        nFileIndexHigh As Long
        nFileIndexLow As Long
End Type

 4. Add a Command Button control to Form1. Command1 is created by default.
 5. Add the following code to the Click event for Command1:

Private Sub Command1_Click()
    Dim Ret As Long
    Dim FileHandle As Long
    Dim FileInfo As BY_HANDLE_FILE_INFORMATION
    Dim lpReOpenBuff As OFSTRUCT
    Dim FileTime As SYSTEMTIME

    FileHandle = OpenFile("c:\autoexec.bat", lpReOpenBuff, OF_READ)
    Ret = GetFileInformationByHandle(FileHandle, FileInfo)
    Ret = FileTimeToSystemTime(FileInfo.ftCreationTime, FileTime)
    Print "File created on " & FileTime.wYear, FileTime.wMonth,
       FileTime.wDay

    Ret = FileTimeToSystemTime(FileInfo.ftLastAccessTime, FileTime)
    Print "File last accessed on: " & FileTime.wYear, FileTime.wMonth,
       FileTime.wDay

    Ret = FileTimeToSystemTime(FileInfo.ftLastWriteTime, FileTime)
    Print "File last written to: " & FileTime.wYear, FileTime.wMonth,
       FileTime.wDay
    Print "Volume Serial Number is: " & FileInfo.dwVolumeSerialNumber
    Print "File attributes are: " & FileInfo.dwFileAttributes

    Ret = CloseHandle(FileHandle)
End Sub

Run the example program by pressing F5. Click the Command Button control.
The program displays the file's creation date, last access date, and last
write date, as well as the disk's volume serial number and the attributes
associated with the file.

Additional References
"BY_HANDLE_FILE_INFORMATION QuickInfo." (Library, Product Documentation,
   SDKs, Win32 SDK, Win32 Programmer's Reference, Reference, Structures,
   ABC to CWPRETSTRUCT)
"File Times." (Library, Product Documentation, SDKs, Win32 SDK,
   Win32 Programmer's Reference, Overviews, Window Management,
   System Services, Time, About Time)
"FileTimeToSystemTime QuickInfo Overview Group." (Library,
   Product Documentation, SDKs, Win32 SDK, Win32 Programmer's Reference,
   Reference, Functions, EnumObjects to FillConsoleOutputCharacter)
"GetFileInformationByHandle QuickInfo Overview Group." (Library,
   Product Documentation, SDKs, Win32 SDK, Win32 Programmer's Reference,
   Reference, Functions, GetCurrencyFormat to GetFileTime)


Return