进程删除不了本程序所在的文件夹!求助!!!!!

时间:2021-04-14 22:14:53
1、求助啊  我写了一个程序,主要功能是:删除自己所在文件夹下的所有文件,并删除该文件夹。
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分给自己了。

#5


该回复于2012-08-16 08:24:02被版主删除

#6


该回复于2012-08-16 08:24:02被版主删除

#1


有谁知道是为什吗?难道是我启动的进程占用了文件夹?

#2


这个道理很简单吧,你EXE所在的都删除不掉的,因为系统在使用啊。

#3


windows本意就是这么设计的,自删除不应该通过复制exe来实现

#4


原因是程序当前目录删除不了,只要改变下当前目录就行了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。

#5


该回复于2012-08-16 08:24:02被版主删除

#6


该回复于2012-08-16 08:24:02被版主删除