GetTempPath和GetTempFileName函数

来源:互联网 发布:java导入jar包 编辑:程序博客网 时间:2024/05/01 19:57

0x01.GetTempPath函数

  • GetTempPath是程序代码,用于获取为临时文件指定的路径。
DWORD WINAPI GetTempPath(  _In_  DWORD  nBufferLength, //字符串缓冲区的大小由lpBuffer标识,在TCHARs中。  _Out_ LPTSTR lpBuffer       //指向字符串缓冲区的指针,它接收指定临时文件路径的以空字符结尾的字符串。 返回的字符串以反斜杠结尾,例如“C:\ TEMP \”。);

返回值

如果函数成功,返回值是复制到lpBuffer的字符串的长度(以TCHAR为单位),不包括终止空字符。 如果返回值大于nBufferLength,则返回值是保存路径所需的缓冲区的长度(以TCHAR为单位)。
如果函数失败,返回值为零。 要获取扩展错误信息,请调用GetLastError。最大可能的返回值为MAX_PATH + 1(261)

0x02.GetTempFileName函数

  • 创建临时文件的名称。 如果生成了唯一的文件名,则会创建一个空文件,并释放其句柄; 否则,仅生成文件名。
UINT WINAPI GetTempFileName(  _In_  LPCTSTR lpPathName,  _In_  LPCTSTR lpPrefixString,  _In_  UINT    uUnique,  _Out_ LPTSTR  lpTempFileName);

参数

lpPathName [in]

文件名的目录路径。应用程序通常为当前目录或GetTempPath函数的结果指定句点(。)。该字符串不能超过MAX_PATH-14个字符或GetTempFileName将失败。如果此参数为NULL,则函数将失败。

lpPrefixString [in]

以null结尾的前缀字符串。该函数使用此字符串的前三个字符作为文件名的前缀。此字符串必须由OEM定义的字符集中的字符组成。
独特的

uUnique [in]

用于创建临时文件名的无符号整数。有关详细信息,请参阅注释。
如果uUnique为零,则函数将尝试使用当前系统时间形成唯一的文件名。如果文件已存在,则数字增加1,并且函数测试此文件是否已存在。这样继续,直到找到唯一的文件名;该函数使用该名称创建一个文件并关闭它。请注意,当uUnique非零时,该函数不会尝试验证文件名的唯一性。

lpTempFileName [out]

指向接收临时文件名的缓冲区的指针。此缓冲区应为MAX_PATH个字符,以容纳路径和终止空字符。

0x03.Example

  • 创建和使用零时文件。
////  This application opens a file specified by the user and uses//  a temporary file to convert the file to upper case letters.//  Note that the given source file is assumed to be an ASCII text file//  and the new file created is overwritten each time the application is//  run.//#include <windows.h>#include <tchar.h>#include <stdio.h>#define BUFSIZE 1024void PrintError(LPCTSTR errDesc);int _tmain(int argc, TCHAR *argv[]){    HANDLE hFile     = INVALID_HANDLE_VALUE;    HANDLE hTempFile = INVALID_HANDLE_VALUE;     BOOL fSuccess  = FALSE;    DWORD dwRetVal = 0;    UINT uRetVal   = 0;    DWORD dwBytesRead    = 0;    DWORD dwBytesWritten = 0;     TCHAR szTempFileName[MAX_PATH];      TCHAR lpTempPathBuffer[MAX_PATH];    char  chBuffer[BUFSIZE];     LPCTSTR errMsg;    if(argc != 2)    {        _tprintf(TEXT("Usage: %s <file>\n"), argv[0]);        return -1;    }    //  Opens the existing file.     hFile = CreateFile(argv[1],               // file name                        GENERIC_READ,          // open for reading                        0,                     // do not share                        NULL,                  // default security                        OPEN_EXISTING,         // existing file only                        FILE_ATTRIBUTE_NORMAL, // normal file                        NULL);                 // no template     if (hFile == INVALID_HANDLE_VALUE)     {         PrintError(TEXT("First CreateFile failed"));        return (1);    }      //  Gets the temp path env string (no guarantee it's a valid path).    dwRetVal = GetTempPath(MAX_PATH,          // length of the buffer                           lpTempPathBuffer); // buffer for path     if (dwRetVal > MAX_PATH || (dwRetVal == 0))    {        PrintError(TEXT("GetTempPath failed"));        if (!CloseHandle(hFile))        {            PrintError(TEXT("CloseHandle(hFile) failed"));            return (7);        }        return (2);    }    //  Generates a temporary file name.     uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files                              TEXT("DEMO"),     // temp file name prefix                               0,                // create unique name                               szTempFileName);  // buffer for name     if (uRetVal == 0)    {        PrintError(TEXT("GetTempFileName failed"));        if (!CloseHandle(hFile))        {            PrintError(TEXT("CloseHandle(hFile) failed"));            return (7);        }        return (3);    }    //  Creates the new file to write to for the upper-case version.    hTempFile = CreateFile((LPTSTR) szTempFileName, // file name                            GENERIC_WRITE,        // open for write                            0,                    // do not share                            NULL,                 // default security                            CREATE_ALWAYS,        // overwrite existing                           FILE_ATTRIBUTE_NORMAL,// normal file                            NULL);                // no template     if (hTempFile == INVALID_HANDLE_VALUE)     {         PrintError(TEXT("Second CreateFile failed"));        if (!CloseHandle(hFile))        {            PrintError(TEXT("CloseHandle(hFile) failed"));            return (7);        }        return (4);    }     //  Reads BUFSIZE blocks to the buffer and converts all characters in     //  the buffer to upper case, then writes the buffer to the temporary     //  file.     do     {        if (ReadFile(hFile, chBuffer, BUFSIZE, &dwBytesRead, NULL))         {            //  Replaces lower case letters with upper case            //  in place (using the same buffer). The return            //  value is the number of replacements performed,            //  which we aren't interested in for this demo.            CharUpperBuffA(chBuffer, dwBytesRead);             fSuccess = WriteFile(hTempFile,                                  chBuffer,                                  dwBytesRead,                                 &dwBytesWritten,                                  NULL);             if (!fSuccess)             {                PrintError(TEXT("WriteFile failed"));                return (5);            }        }         else        {            PrintError(TEXT("ReadFile failed"));            return (6);        }    //  Continues until the whole file is processed.    } while (dwBytesRead == BUFSIZE);     //  The handles to the files are no longer needed, so    //  they are closed prior to moving the new file.    if (!CloseHandle(hFile))     {       PrintError(TEXT("CloseHandle(hFile) failed"));       return (7);    }    if (!CloseHandle(hTempFile))     {       PrintError(TEXT("CloseHandle(hTempFile) failed"));       return (8);    }    //  Moves the temporary file to the new text file, allowing for differnt    //  drive letters or volume names.    fSuccess = MoveFileEx(szTempFileName,                           TEXT("AllCaps.txt"),                           MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED);    if (!fSuccess)    {         PrintError(TEXT("MoveFileEx failed"));        return (9);    }    else         _tprintf(TEXT("All-caps version of %s written to AllCaps.txt\n"), argv[1]);    return (0);}//  ErrorMessage support function.//  Retrieves the system error message for the GetLastError() code.//  Note: caller must use LocalFree() on the returned LPCTSTR buffer.LPCTSTR ErrorMessage(DWORD error) {     LPVOID lpMsgBuf;    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER                    | FORMAT_MESSAGE_FROM_SYSTEM                    | FORMAT_MESSAGE_IGNORE_INSERTS,                  NULL,                  error,                  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),                  (LPTSTR) &lpMsgBuf,                  0,                  NULL);    return((LPCTSTR)lpMsgBuf);}//  PrintError support function.//  Simple wrapper function for error output.void PrintError(LPCTSTR errDesc){        LPCTSTR errMsg = ErrorMessage(GetLastError());        _tprintf(TEXT("\n** ERROR ** %s: %s\n"), errDesc, errMsg);        LocalFree((LPVOID)errMsg);}
0 0