进程删除不了本程序所在的文件夹!求助!!!!!
1、求助啊 我写了一个程序,主要功能是:删除自己所在文件夹下的所有文件,并删除该文件夹。
2、是这样的 程序启动(程序1)--复制自己到别的路径--启动已经复制的程序(程序2),并通过命令行传参数(要删除的文件夹的地址)--结束程序1--程序2通过命令行参数 删除文件夹下的所有文件包括文件夹
3、现在通过VS启动程序是可以实现功能 ,但是当我点击release文件夹里面的程序的时候,可以把release文件夹下的所有文件删除 但是不能删除release文件夹
- C/C++ code
#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;}
[解决办法]
这个道理很简单吧,你EXE所在的都删除不掉的,因为系统在使用啊。
[解决办法]
windows本意就是这么设计的,自删除不应该通过复制exe来实现