윈도우에는 임시 파일을 저장하는 임시 폴더가 있습니다. 프로그램이 임시로 만든 파일들을 생성하는 폴더인데 잡다한 파일들이 다 있습니다.
프로그램을 개발하는 개발자 입장에서는, 프로그램에 실행 시 자주 반복되면서 시간이 오래 걸리는 것들을 임시 파일로 만들어 관리 할 수 있습니다. 예를 들면 웹에서 쿠키 데이터, 캐시 된 이미지 및 파일 같은 것들이 있습니다. 사용자가 사이트 이동할 때마다 이미지나 파일을 불러오면 그것도 나름 낭비니까요.

임시 폴더 경로 얻기 – GetTempPath, GetTempPath2
GetTempPath는 임시 폴더를 가져오는 Win32 함수입니다.
DWORD GetTempPathA(
[in] DWORD nBufferLength,
[out] LPSTR lpBuffer
);
DWORD GetTempPathW(
[in] DWORD nBufferLength,
[out] LPWSTR lpBuffer
);
- 첫번째 인자 nBufferLength는 문자열 버퍼의 크기입니다.
- 두번째 인자 lpBuffer는 문자열 버퍼에 대한 포인터입니다.
- 함수가 성공하면 반환 값으로 문자열 버퍼에 저장된 버퍼 길이입니다. 실패하면 반환 값은 0 입니다.
실패 원인은 GetLastError 함수를 호출하여 오류 정보를 얻을 수 있습니다.
MSDN에 특정 경우에 GetTempPath 함수 말고 GetTempPath2 함수를 사용하라고 하는데 함수 매개변수나 반환 값에는 차이가 없으니 상황에 맞게 사용합니다. 아래 코드는 실제 예시 코드입니다.
TCHAR tzTempPath[MAX_PATH];
memset(tzTempPath, 0x00, sizeof(tzTempPath));
int iTempPathLen = GetTempPath(MAX_PATH, tzTempPath);
//int iTempPathLen = GetTempPath2(MAX_PATH, tzTempPath);
if (0 <= iTempPathLen)
{
CString strTempPath = CString(tzTempPath);
AfxMessageBox(strTempPath);
}
else
{
DWORD dwErr = GetLastError();
}

임시 파일 이름 얻기 – GetTempFileName
다음은 임시 파일 이름을 얻는 방법입니다. GetTempFileName 함수를 사용합니다.
UINT GetTempFileName(
[in] LPCTSTR lpPathName,
[in] LPCTSTR lpPrefixString,
[in] UINT uUnique,
[out] LPTSTR lpTempFileName
);
- 첫번째 인자 lpPathName은 디렉토리 경로 입니다. NULL이면 함수가 실패합니다.
그러니 위에서 얻어온 임시 폴더 경로를 여기에 넣어주면 됩니다. - 두번째 인자 lpPrefixString는 임시 파일 이름 접두사에 들어갈 3문자를 지정하는 인자입니다.
예를 들어 lpPrefixString에 _T(“KR_”)을 넣으면 임시 파일 이름 앞에 “KR_” 문자열이 붙습니다. 큰 이유 없으면 빈 문자열을 넣습니다. - 세번째 인자 uUnique는 임시 파일 이름을 만드는데 사용할 인자입니다.
값이 0 이면 파일 이름 고유성을 체크하고, 0 이 아니면 체크하지 않습니다. 그러니 0으로 고정시키면 됩니다. - 네번째 인자 lpTempFileName은 임시 파일 이름을 수신하는 버퍼에 대 한 포인터입니다.
- 함수가 성공하면 반환 값으로 문자열 버퍼에 저장된 버퍼 길이입니다. 실패하면 반환 값은 0 입니다.
실패 원인은 GetLastError 함수를 호출하여 오류 정보를 얻을 수 있습니다.
아래 코드는 예시 코드입니다.
TCHAR tzTempName[MAX_PATH];
memset(tzTempName, 0x00, sizeof(tzTempName));
int iTempFileNameLen = GetTempFileName(tzTempPath, _T(""), 0, tzTempName);
if (0 <= iTempFileNameLen)
{
CString strTempName = CString(tzTempName);
AfxMessageBox(strTempName);
}
else
{
DWORD dwErr = GetLastError();
}
아래는 실행 결과입니다. 예시 코드에서 GetTempFileName 함수 첫번째 인자에 임시 폴더 경로를 넣었기 떄문에, 임시 폴더 경로가 포함된 문자열을 얻었고, 아래 빨간 부분이 얻어온 임시 파일 이름입니다.

GetTempFileName 함수를 호출하면 아래와 같이 해당 경로에 해당 이름으로 파일이 생성 됩니다.

그러니 함수 반환 값을 보고 잘 생성 되었으면 바로 파일을 사용해주도록 합니다.
TCHAR tzTempName[MAX_PATH];
memset(tzTempName, 0x00, sizeof(tzTempName));
int iTempFileNameLen = GetTempFileName(tzTempPath, _T(""), 0, tzTempName);
if (0 <= iTempFileNameLen)
{
CString strTempName = CString(tzTempName);
AfxMessageBox(strTempName);
CStdioFile file;
if (file.Open(strTempName, CStdioFile::modeReadWrite | CStdioFile::shareExclusive | CStdioFile::typeBinary))
{
// todo .. :
file.Close();
}
}
else
{
DWORD dwErr = GetLastError();
}
- GetTempPath msdn : https://learn.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-gettemppatha
- GetTempFileName msdn : https://learn.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-gettempfilename