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

lyshiba 2012-08-15 04:45:22
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;

}




...全文
224 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyshiba 2012-08-15
  • 打赏
  • 举报
回复
原因是程序当前目录删除不了,只要改变下当前目录就行了。
在main函数中加入这一段
if (!SetCurrentDirectory(L"c:\\"))
{
MessageBox(NULL, L"设置当前路径失败", L"Error", MB_OK);
}
一个同事帮忙解决的。ok分给自己了。
许文君 2012-08-15
  • 打赏
  • 举报
回复
windows本意就是这么设计的,自删除不应该通过复制exe来实现
傻X 2012-08-15
  • 打赏
  • 举报
回复
这个道理很简单吧,你EXE所在的都删除不掉的,因为系统在使用啊。
lyshiba 2012-08-15
  • 打赏
  • 举报
回复
有谁知道是为什吗?难道是我启动的进程占用了文件夹?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧