VC中如何将资源打包并释放到指定文件夹

转载请注明来源:https://www.cnblogs.com/hookjc/

很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行,

很多安装程序或者比较高级点的智能程序都已经这样做,比如文件损坏时,安装程序将修复这些文件.一些高级程序的常用设置及文件

遇到破坏时,也会自我修复,它们的这些神奇功能,全都是依靠自身的资源包,替换损坏的文件,或者创建新的默认文件实现的.

下面我来说一说这种程序比较普通的一些做法:

首先在程序入口处,我们以MFC程序为例子,我们找到APP文件,在InitInstance()中执行文件检查,如果发现某些文件损坏或者不存在,

那么我们将自身资源包的正常文件释放出来,在这里我给出两个函数,一个是检查指定文件是否存在,另一个是释放资源包文件的函数

if(!FileExteriorFile(FileName))//注意:FileName是你指定目录下的指定文件   {    if(!FreeMyData(MAKEINTRESOURCE(IDR_EXFILE1), "ExFile", FileName,0))//释放文件到指定目录    {     MessageBox(NULL,FileName,"Free File Fail:",MB_ICONERROR);    }     }
发现不存在时,将调用下面的函数释放资源包的文件

//将指定资源释放到指定目录下生成特定文件  
BOOL FreeMyData(LPCTSTR ResName, LPCTSTR ResType, LPCTSTR FileName, int Type)  
{   
BOOL bRet = TRUE;   
HINSTANCE hInst = AfxGetInstanceHandle();      //先判断我们指定的资源是否存在   
HRSRC hResInfo = FindResource(hInst,ResName,ResType);      
if(hResInfo == NULL)    
 return FALSE;     
HANDLE hFile = NULL;    
DWORD dwWritten = 0;       //开始调入指定的资源到内存   
 HGLOBAL hResData = LoadResource(hInst,hResInfo);   
LPVOID pvResData = LockResource(hResData);   
DWORD dwResSize = SizeofResource(hInst,hResInfo);       //再创建目标文件并保存数据至文件  
 if(Type == 1)//系统加隐藏属性 如果指定类型为1,那么加上系统和隐藏属性,防止普通用户对文件进行破坏  
 {    
hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM, NULL);    WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);   }   else   {    hFile = CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,     NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);    WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);   }   if(hFile == INVALID_HANDLE_VALUE)//创建文件失败   {    FreeResource(hResData);    return FALSE;   }      //释放有关内存资源   CloseHandle(hFile);   FreeResource(hResData);      return TRUE;  }
将上面两个函数COPY到你工程的APP文件中,现在假设你已将一个Demo.dat文件通过资源映射导入工程当中,类型属于ExFile,文件名是IDR_EXFILE1,
那么你在InitInstance()中的调用形式如下:
BOOL FileExteriorFile(LPCTSTR FileName)//查找指定的文件是否存在  {   WIN32_FIND_DATA fd;    HANDLE hd=::FindFirstFile(FileName,&fd);//开始查找   if(hd==INVALID_HANDLE_VALUE)    {    return FALSE;   }   FindClose(hd);//关闭查找   return TRUE;  }

来源:python脚本自动迁移

posted @ 2020-06-29 11:23  jiangcheng_15  阅读(435)  评论(0编辑  收藏  举报