기획팀에서 1회만 실행되는(종료되면 삭제되는) 프로그램을 만들어 달란 요청이 간간히 들어옵니다.
그때마다 어떻게 했더라 매일 검색하고 찾는 나 자신을 보면서 기록합니다.
이번 글에서는 프로그램 종료 시 자기 자신을 삭제하는 프로그램을 만드는 방법에 대해 알아보겠습니다.
파일을 삭제하는 API 함수는 있으나, 윈도우에서는 실행 중인 프로그램(자기 자신)의 .exe파일을 삭제 할 수 없으므로,
.exe 삭제를 batch 파일에서 해줘야 합니다.
아래는 MFCApplication1.exe에서 batch 파일을 만들고, 삭제 스크립트를 batch 파일에 입력, batch 실행하는 코드입니다.
void CMFCApplication1Dlg::MakeSelfKillBatch()
{
// 현재 실행하는 프로그램 경로
TCHAR tzFullPathName[MAX_PATH] = {0,};
::GetModuleFileName((HMODULE)&__ImageBase, tzFullPathName, sizeof(tzFullPathName));
CString strDelFilePathName;
strDelFilePathName.Format(_T("%s"), tzFullPathName);
CString strDelFileName = PathFindFileName(strDelFilePathName);
CString strDelFilePath = strDelFilePathName;
strDelFilePath.Replace(strDelFileName, _T(""));
// batch 파일
CString strKillerName(_T("killfile.bat"));
CString strKillerPathName;
strKillerPathName.Format(_T("%s%s"), strDelFilePath, strKillerName);
// batch 파일 생성
BOOL bOpen = m_file.Open(strKillerPathName, CStdioFile::modeCreate | CStdioFile::typeText | CStdioFile::modeReadWrite | CStdioFile::shareExclusive);
if (bOpen)
{
// batch파일 내용 작성
CString strBatFileText(_T(""));
strBatFileText.Format(_T(":Repeat\r\ndel /f /s /q %s\r\nif exist \"%s\" goto Repeat\r\ndel /s /q %s\r\n"),
strDelFilePathName, strDelFilePathName, strKillerPathName);
m_file.WriteString(strBatFileText);
//m_file.Flush();
m_file.Close();
}
// batch 파일을 실행
HINSTANCE hIns = ShellExecute(NULL, _T("open"), strKillerPathName, NULL, NULL, 0);
}
void CMFCApplication1Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
MakeSelfKillBatch(); // 종료될 때 호출
}
위 코드를 실행 했을 때 생성되는 batch 파일 스크립트는 아래와 같습니다.
:Repeat
del /f /s /q D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\MFCApplication1.exe
if exist "D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\MFCApplication1.exe" goto Repeat
del /s /q D:\ect\study\MFC\SelfKill\MFCApplication1\Debug\killfile.bat
스크립트를 해석하면 아래와 같습니다.
- MFCApplication1.exe를 삭제
- MFCApplication1.exe가 존재하면 Repeat으로 이동.(다시 1번 수행)
존재하지 않으면 다음 작업 수행 - killfile.bat 파일 삭제
아래처럼 동작하는 것을 볼 수 있습니다.