Tesla.Angela 发表于 2014-4-8 17:43:19

递归删除FOLDER和注册表KEY(纯C语言WIN32API单函数无注释版)

删文件夹:
void DeleteFolder(char *szFilePath)
{
    WIN32_FIND_DATAA fd;
    char szSearch={0};
    strcpy(szSearch,szFilePath);
    strcat(szSearch,"*.*");
    HANDLE h=FindFirstFileA(szSearch,&fd);
    if(h!=INVALID_HANDLE_VALUE)
    {
      BOOL bRet=TRUE;
      while(bRet)
      {
            bRet=FindNextFileA(h,&fd);
            if(stricmp(fd.cFileName,".."))
            {
                char tmp={0};
                strcpy(tmp,szFilePath);
                strcat(tmp,fd.cFileName);
                if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                  strcat(tmp,"\\");
                  //printf("%s\n",tmp);
                  DeleteFolder(tmp);
                  RemoveDirectoryA(tmp);
                }
                else
                {
                  //printf("%s\n",tmp);
                  DeleteFileA(tmp);
                }
            }
      }
      FindClose(h);
    }
    RemoveDirectoryA(szFilePath);
}
删注册表键:
VOID RegDeleteKeys(HKEY RootKey, const char *pSubKey)
{
    HKEY hKey;
    DWORD nRet,NameCnt,NameMaxLen,KeyCnt,KeyMaxLen,MaxDateLen;
    nRet=RegOpenKeyExA(RootKey,pSubKey,0,KEY_ALL_ACCESS,&hKey);
    if(nRet!=ERROR_SUCCESS)
    {
      return;
    }
    nRet = RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL);
    if(nRet == ERROR_SUCCESS)
    {
      for(int dwIndex = KeyCnt - 1; dwIndex >= 0; dwIndex--)
      {
            char sKeyName = {0}, pSubKeyTemp = {0};
            RegEnumKeyA(hKey, dwIndex, sKeyName, sizeof(sKeyName));
            HKEY hKeySub;
            DWORD KeyCntSub;
            strcpy(pSubKeyTemp, pSubKey);
            strcat(pSubKeyTemp, "\\");
            strcat(pSubKeyTemp, sKeyName);
            nRet = RegOpenKeyExA(RootKey,pSubKeyTemp,0,KEY_ALL_ACCESS,&hKeySub);
            if(nRet == ERROR_SUCCESS)
            {
                nRet = RegQueryInfoKey(hKeySub,NULL,NULL,NULL,&KeyCntSub,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL);
                if(nRet == ERROR_SUCCESS)
                {
                  if (KeyCntSub != 0)
                  {
                        RegDeleteKeys(RootKey, pSubKeyTemp);
                  }
                  RegCloseKey(hKeySub);
                }
            }
            RegDeleteKeyA(RootKey ,pSubKeyTemp);
      }
      RegCloseKey(hKey);
    }
    RegDeleteKeyA(RootKey ,pSubKey);
}
例子:
DeleteFolder("c:\\windows\\");
RegDeleteKeys(HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\services");

upring 发表于 2015-4-23 19:46:04

谢谢分享 {:soso_e195:}

baichimm 发表于 2019-5-7 09:50:53

谢谢
页: [1]
查看完整版本: 递归删除FOLDER和注册表KEY(纯C语言WIN32API单函数无注释版)