首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-10-13 
进程删除不了本程序所在的文件夹!求助!!!!!1、求助啊我写了一个程序,主要功能是:删除自己所在文件夹下的所

进程删除不了本程序所在的文件夹!求助!!!!!
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来实现

热点排行