How To Use GetTempFileName API to Create a Unique Temporary File

This article was previously published under Q195763
This article has been archived. It is offered "as is" and will no longer be updated.
For Visual Basic programmers unfamiliar with the Win32 API, making a filename for a temporary file is often a matter of hard-coding some value andhoping that the name does not conflict with an existing file. Fortunately,there is a better way that requires very little code.

This article demonstrates how to use the GetTempPath and GetTempFileNameAPI functions to construct a unique temporary file name located in thedefault temp directory of an end user's system.


The GetTempPath API function allows you to determine the path location of asystem's temporary folder. It takes two parameters: the length of a fixed-length or pre-initialized string that will contain the path name, and thestring itself. You must use either a fixed-length string, or a stringinitialized to a length that you believe will be long enough to contain thepath information. This is to guarantee that Visual Basic allocates enoughbuffer space for Windows to return the information.

GetTempPath returns the length of the path name measured in bytes, or 0 ifan error occurs. If the return value is greater than the buffer size youspecified, then no path information was written to the string.

The declaration for GetTempPath is provided in the sample below.


The GetTempFileName API function is used to create a fully-qualifiedtemporary file name at a given location. The function takes fourparameters: the string containing the path for the file, a stringcontaining a prefix used to start the unique file name, a unique number toconstruct the temp name, and, finally, a fixed-length or pre-initializedstring used to return the fully qualified file name. Both the path andprefix strings are required and cannot be empty. The unique number can be 0(NULL), in which case GetTempFileName creates a unique number based on thecurrent system time.

GetTempFileName returns the unique number used to create the file name, orreturns 0 if an error occurs.

The declaration for GetTempFileName is provided in the sample below.

Step-by-Step Example

  1. Create a new Standard EXE project. Form1 is created by default.
  2. Add a CommandButton to Form1.
  3. Add the following code to the General Declarations section of Form1:
           Option Explicit      Private Declare Function GetTempPath Lib "kernel32" _         Alias "GetTempPathA" (ByVal nBufferLength As Long, _         ByVal lpBuffer As String) As Long      Private Declare Function GetTempFileName Lib "kernel32" _         Alias "GetTempFileNameA" (ByVal lpszPath As String, _         ByVal lpPrefixString As String, ByVal wUnique As Long, _         ByVal lpTempFileName As String) As Long      Private Function CreateTempFile(sPrefix As String) As String         Dim sTmpPath As String * 512         Dim sTmpName As String * 576         Dim nRet As Long         nRet = GetTempPath(512, sTmpPath)         If (nRet > 0 And nRet < 512) Then            nRet = GetTempFileName(sTmpPath, sPrefix, 0, sTmpName)            If nRet <> 0 Then               CreateTempFile = Left$(sTmpName, _                  InStr(sTmpName, vbNullChar) - 1)            End If         End If      End Function      Private Sub Command1_Click()         Dim sTmpFile As String         Dim sMsg As String         Dim hFile As Long         sTmpFile = CreateTempFile("VBT")         hFile = FreeFile         Open sTmpFile For Binary As hFile            Put #hFile, , "This is a test. 1234"         Close hFile         sMsg = "Temp FileName: " & sTmpFile & vbCrLf         sMsg = sMsg & "File Length: " & FileLen(sTmpFile) & vbCrLf         sMsg = sMsg & "Time Created: " & _            Format$(FileDateTime(sTmpFile), "long time") & vbCrLf         MsgBox sMsg, vbInformation, "TempFile"         Kill sTmpFile      End Sub						
  4. Press the F5 key to run the project. When you click the CommandButton, a temporary file is created. A message box displays information regarding the temp file. The file is then destroyed using the Kill statement.
For additional information, please see the following articles in theMicrosoft Knowledge Base:
190000 : How To Get Started Programming With the Windows API (LONG)

137034 : PRB: Win32 GetTempFileName API Differs from 16-bit

(c) Microsoft Corporation 1998, All Rights Reserved. Contributions byRichard R. Taylor, Microsoft Corporation.

Article ID: 195763 - Last Review: 12/05/2015 09:43:13 - Revision: 2.1

Microsoft Visual Basic 5.0 Learning Edition, Microsoft Visual Basic 6.0 Learning Edition, Microsoft Visual Basic 5.0 Professional Edition, Microsoft Visual Basic 6.0 Professional Edition, Microsoft Visual Basic 5.0 Enterprise Edition, Microsoft Visual Basic 6.0 Enterprise Edition

  • kbnosurvey kbarchive kbhowto kbapi kbkernbase kbcode KB195763