2、是这样的 程序启动(程序1)--复制自己到别的路径--启动已经复制的程序(程序2),并通过命令行传参数(要删除的文件夹的地址)--结束程序1--程序2通过命令行参数 删除文件夹下的所有文件包括文件夹
3、现在通过VS启动程序是可以实现功能 ,但是当我点击release文件夹里面的程序的时候,可以把release文件夹下的所有文件删除 但是不能删除release文件夹
#include "stdafx.h"
#include <Winbase.h>
#include <TCHAR.h>
#include <Shellapi.h>
#include <shlwapi.h>
//删除需要卸载的文件,并删除自己
BOOL SelfDelete();
BOOL DeleteDirectory(LPTSTR strDir);
int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n)
{
MessageBox(NULL, L"启动进程", L"Error", MB_OK);
SelfDelete();
return(0);
}
BOOL SelfDelete()
{
TCHAR sSourceName[MAX_PATH], sTempName[MAX_PATH];
//取得运行文件名
GetModuleFileName(NULL, sSourceName, MAX_PATH);
//取得windows的临时路径
GetTempPath(MAX_PATH,sTempName);
//获得程序后面命令行的参数和个数
LPTSTR *szArgList;
int argCount;
szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
if (szArgList == NULL)
{
MessageBox(NULL, L"Unable to parse command line", L"Error", MB_OK);
return 10;
}
if (argCount == 1)
{
_tcscpy(sTempName, L"c:\\test.exe");
//复制程序
CopyFile(sSourceName, sTempName, FALSE);
//获得文件的上一层文件夹名称
TCHAR* strEnd = _tcsrchr(sSourceName, L'\\');
sSourceName[strEnd - sSourceName] = L'\0';
TCHAR szCmdLine[1024];
//取得当前运行进程
HANDLE hProcess = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
//构造命令行参数 运行文件、当前运行的进程、原文件
_stprintf(szCmdLine, L"%s \"%s\" %d ",sTempName, sSourceName,hProcess);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
//创建进程,带有命令行参数
if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
::MessageBox(NULL, L"不能启动进程!", L"info", MB_OK);
}
CloseHandle(hProcess);
}
else
{
if (szArgList[1] == NULL ||szArgList[2] == NULL ||szArgList[3] == NULL)
{
::MessageBox(NULL, L"参数不能为空", L"错误", MB_OK);
return FALSE;
}
HANDLE hPress = (HANDLE) _ttoi(szArgList[2]);
//等行前一进程结束,此函数返回
WaitForSingleObject(hPress, INFINITE);
//关闭进程
CloseHandle(hPress);
//::MessageBox(NULL, szArgList[4], L"info", MB_OK);
//删除文件夹和文件
if (PathIsDirectory(szArgList[1]))
{
if (!DeleteDirectory(szArgList[1]))
{
::MessageBox(NULL, L"不能正常删除", L"info", MB_OK);
}
}
LocalFree(szArgList);
return TRUE;
}
}
BOOL DeleteDirectory(LPTSTR strDir)
{
UINT i = _tcslen(strDir);
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
TCHAR szSeachPath[MAX_PATH];
if (!PathIsDirectory(strDir))
{
return FALSE;
}
SetFileAttributes(strDir, FILE_ATTRIBUTE_NORMAL);
_tcscpy(szSeachPath, strDir);
if (_tcscmp(strDir + i-1, L"\\") != 0)
{
_tcscat(szSeachPath, L"\\");
}
_tcscat(szSeachPath, L"*");
BOOL fFinished = FALSE;
hSearch = FindFirstFile(szSeachPath, &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
return FALSE;
}
while (FindNextFile(hSearch, &FileData))
{
if(_tcscmp(FileData.cFileName, L".") == 0 || _tcscmp(FileData.cFileName, L"..") == 0)
{
continue;
}
TCHAR szNewFile[MAX_PATH];
_tcscpy(szNewFile, strDir);
if (_tcscmp(strDir + i-1, L"\\") != 0)
{
_tcscat(szNewFile, L"\\");
}
_tcscat(szNewFile, FileData.cFileName);
if(PathIsDirectory(szNewFile))
{
// 递归删除子文件夹
DeleteDirectory(szNewFile);
RemoveDirectory(szNewFile);
}
else
{
// 删除文件
DeleteFile(szNewFile);
}
}
if (!FindClose(hSearch))
{
return FALSE;
}
if (!RemoveDirectory(strDir))
{
::MessageBox(NULL, strDir, L"删除文件夹失败", MB_OK);
}
return TRUE;
}
6 个解决方案
#1
有谁知道是为什吗?难道是我启动的进程占用了文件夹?
#2
这个道理很简单吧,你EXE所在的都删除不掉的,因为系统在使用啊。
#3
windows本意就是这么设计的,自删除不应该通过复制exe来实现
#4
原因是程序当前目录删除不了,只要改变下当前目录就行了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。
#5
#6
#1
有谁知道是为什吗?难道是我启动的进程占用了文件夹?
#2
这个道理很简单吧,你EXE所在的都删除不掉的,因为系统在使用啊。
#3
windows本意就是这么设计的,自删除不应该通过复制exe来实现
#4
原因是程序当前目录删除不了,只要改变下当前目录就行了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。