转载请注明来源: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脚本自动迁移

VC中如何将资源打包并释放到指定文件夹的更多相关文章

  1. Win10 中 Git clone github上内容保存到指定文件夹

    在要存储的右键→Git Bash Here 弹出命令窗口 输入 git clone 链接 很快就下载完成

  2. webpack 打包出多个HTML文件,多个js文件,图片文件放置到指定文件夹中

    一.webpack.config.js简单代码 const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { ...

  3. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  4. VC 获取指定文件夹路径的方法小结

    VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...

  5. win7文件夹图标中多了一把小锁打不开文件夹怎么办?

    win7文件夹图标中多了一把小锁打不开文件夹怎么办?解决办法一:右击目录→取得管理员权限!该方法适用于win7旗舰版.解决办法二:右击目录→属性→安全→高级→选择everyone→更改权限→勾上完全访 ...

  6. (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...

  7. Android 遍历sdcard中指定文件夹下的图片(jpg,jpeg,png)

    File scanner5Directory = new File(Environment.getExternalStorageDirectory().getPath() + "/scann ...

  8. [置顶] LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 declare @sql varchar(4000), @dirpath varch ...

  9. C#遍历指定文件夹中的所有文件(转)

    原文链接:http://www.cnblogs.com/qianqianfy/archive/2009/07/08/1518974.html 1. C#遍历指定文件夹中的所有文件 DirectoryI ...

随机推荐

  1. What is being transferred in transfer learning?

    目录 概 主要内容 feature reuse mistakes and feature similarity loss landscape module criticality pre-traine ...

  2. C# .net 使用rabbitmq消息队列——EasyNetQ插件介绍

    EasyNetQ 是一个简洁而适用的RabbitMQ .NET类库,本质上是一个在RabbitMQ.Client之上提供服务的组件集合.

  3. pycharm debug调试模式报“UnicodeDecodeError:'gdk' codec can't decode byte 0xac”,无法正常调试

    遇到的问题: 本机python 3.8 pycharn 3.4.4 运行代码的时候,选择debug模式,提示"UnicodeDecodeError:'gdk' codec can't dec ...

  4. mongodb用户权限管理的CRUD

    https://blog.csdn.net/weixin_34332905/article/details/88759759?utm_medium=distribute.pc_relevant.non ...

  5. Linux下校验SHA1和MD5的方法

    当我们从互联网下载东西或者从U盘拷贝东西的时候,通常是不会和源文件有什么区别的,但是在偶然的情况下会出现下载或者拷贝出错的情况, 尤其是在下载大文件的时候,比如系统光盘......当你装机到一半才发现 ...

  6. js对cookie的操作:读、写、删

    js读写cookie //JS操作cookies方法!//写cookiesfunction setCookie(name,value){var Days = 30;var exp = new Date ...

  7. k8s 理解Service工作原理

    什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法. 简单来说K8s提供了service对象来访问pod.我们在<k8s网络模型与集群通信> ...

  8. 使用.NET 6开发TodoList应用(23)——实现请求限流

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 Rate Limiting允许保护我们的API服务免受过多请求的连接导致的性能下降,如果请求次数超过了限制,API服务端将会拒 ...

  9. Maven插件开发教程

    Maven是一个一个优秀的项目管理开源框架,其插件机制为其功能扩展提供了非常大的便捷性.大多数情况下,我们不需要自己开发Maven插件,因为Maven本身提供了很多便捷的官方插件.但是对于某些特殊场景 ...

  10. Sentine熔断降级进阶

    sentinel和springCloud整合 减少开发的复杂度,对大部分的主流框架,例如:Web Servlet.Dubbo.Spring Cloud.gRPC.Spring WebFlux.Reac ...