依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 8|回复: 0

[游戏架设教程] [传奇技术]传世WPF文件读取c++源码

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12523
发表于 6 小时前 | 显示全部楼层 |阅读模式
[传奇技术]传世WPF文件读取c++源码
  1. bool CWpf::WpfOpen(const char * strPathName,__int64 iOffset,DWORD dwOpenType)
  2. {
  3.         if(strPathName == NULL || dwOpenType == 0)
  4.         {
  5.                 m_eWrLastError = EWR_PARA_ERROR;
  6.                 return false;
  7.         }

  8.         if(m_bSaving)
  9.         {
  10.                 m_eWrLastError = EWR_FILE_SAVING;
  11.                 return false;
  12.         }

  13.         //先关闭当前打开的wpf文件
  14.         WpfClose();

  15.         m_strWpfDir = strPathName;
  16.         replace(m_strWpfDir.begin(),m_strWpfDir.end(),'/','\\');
  17.         size_t iPos = m_strWpfDir.find_last_of("\");
  18.         if (iPos != string::npos)
  19.         {
  20.                 m_strWpfFileName = m_strWpfDir.substr(iPos + 1,m_strWpfDir.length() - iPos - 1);
  21.                 m_strWpfDir = m_strWpfDir.substr(0,iPos);
  22.         }
  23.         //打开或创建文件
  24.         errno_t err = 0;
  25.         if (dwOpenType & EWOT_RDWR)
  26.         {
  27.                 err =         _sopen_s(&(m_iFileHandle[EFT_MAIN]), strPathName, _O_BINARY | _O_RDWR , _SH_DENYWR,  _S_IREAD | _S_IWRITE );
  28.                 dwOpenType |= EWOT_LISTDIR;
  29.         }
  30.         else
  31.         {
  32.                 err =         _sopen_s(&(m_iFileHandle[EFT_MAIN]), strPathName, _O_BINARY | _O_RDONLY , /*_SH_DENYWR*/_SH_DENYNO,  _S_IREAD);
  33.                 if (dwOpenType & EWOT_READONLY)
  34.                 {
  35.                         dwOpenType |= EWOT_LISTHASH;
  36.                 }
  37.         }

  38.         if(err != 0)
  39.         {
  40.                 m_eWrLastError = EWR_FILE_OPEN_FAIL;
  41.                 return false;
  42.         }

  43.         for (int i = EFT_THREAD ; i < EFT_NUM; i ++)
  44.         {
  45.                 err =         _sopen_s(&(m_iFileHandle[i]), strPathName, _O_BINARY | _O_RDONLY , _SH_DENYNO,  _S_IREAD);

  46.                 if(err != 0)
  47.                 {
  48.                         m_eWrLastError = EWR_FILE_OPEN_FAIL;
  49.                         return false;
  50.                 }
  51.         }

  52.         m_iWpfStartPos = iOffset;
  53.         m_WpfHeader.dwMagic = 0;//防止有些文件长度不够sizeof(S_WpfHeader),取到默认值
  54.         m_WpfHeader_Bak.dwMagic = 0;//防止有些文件长度不够sizeof(S_WpfHeader),取到默认值
  55.         m_WpfHeader.bySavingHeader = TRUE;//防止有些文件长度不够sizeof(S_WpfHeader),取到默认值
  56.         m_WpfHeader_Bak.bySavingHeader = TRUE;//防止有些文件长度不够sizeof(S_WpfHeader),取到默认值

  57.         //读入文件头
  58.         _lseeki64(m_iFileHandle[EFT_MAIN],m_iWpfStartPos,SEEK_SET);
  59.         _read(m_iFileHandle[EFT_MAIN],&m_WpfHeader,sizeof(S_WpfHeader));

  60.         //读入文件头备份
  61.         _lseeki64(m_iFileHandle[EFT_MAIN],m_iWpfStartPos + sizeof(S_WpfHeader),SEEK_SET);
  62.         _read(m_iFileHandle[EFT_MAIN],&m_WpfHeader_Bak,sizeof(S_WpfHeader));

  63.         if(m_WpfHeader.bySavingHeader && m_WpfHeader_Bak.bySavingHeader)//该文件在创建的时候出现异常,如断点,程序崩溃等情况,没有正常写入头
  64.         {
  65.                 return false;
  66.         }

  67.         //如果上次文件头没有正确保存,读取必份的文件
  68.         if (m_WpfHeader.bySavingHeader)
  69.         {
  70.                 m_WpfHeader = m_WpfHeader_Bak;
  71.                 m_bModifyed = true;//原来没有保存好,用了备份的,那么这次即使没有修改也要重新保存
  72.         }

  73.         m_WpfHeader_Disk = m_WpfHeader;

  74.         if(m_WpfHeader.dwMagic != WPF_MAGIC)
  75.         {
  76.                 m_eWrLastError = EWR_NOT_WPF_FILE;
  77.                 WpfClose();
  78.                 return false;
  79.         }

  80.         m_WpfHeader.bySavingHeader = FALSE;//理论上不可能出现文件头及备份文件头m_WpfHeader.bySavingHeader同时为TRUE,还是清一下标记
  81.         m_dwOpenType = dwOpenType;

  82.         //如果以写方式打开要求读入空闲块描述信息
  83.         if ((m_dwOpenType & EWOT_RDWR) && m_WpfHeader.dwBlankBlockSize > 0)
  84.         {
  85.                 PBlankBlock pBlock = new BlankBlock[m_WpfHeader.dwBlankBlockSize];
  86.                 _lseeki64(m_iFileHandle[EFT_MAIN],m_iWpfStartPos + m_WpfHeader.iBlankBlockPos,SEEK_SET);
  87.                 _read(m_iFileHandle[EFT_MAIN],pBlock,m_WpfHeader.dwBlankBlockSize * sizeof(BlankBlock));

  88.                 PBlankBlock p = pBlock;
  89.                 PBlankBlockNode pList = NULL,pList2 = NULL;

  90.                 pList = new BlankBlockNode();
  91.                 pList->blankBlock.dwStart = p->dwStart;
  92.                 pList->blankBlock.dwSize = p->dwSize;
  93.                 pList->pParent = NULL;
  94.                 pList->pNext = NULL;
  95.                 m_pBlankBlockList = pList;
  96.                 pList2 = pList;
  97.                 p ++;

  98.                 for (DWORD i = 1; i < m_WpfHeader.dwBlankBlockSize; i++,p++)
  99.                 {
  100.                         pList = new BlankBlockNode();
  101.                         pList->blankBlock.dwStart = p->dwStart;
  102.                         pList->blankBlock.dwSize = p->dwSize;
  103.                         pList->pParent = pList2;
  104.                         pList2->pNext = pList;
  105.                         pList2 = pList;
  106.                 }

  107.                 pList2->pNext = NULL;

  108.                 SAFE_DELETE_ARRAY(pBlock);
  109.         }

  110.         //载入文件分配表
  111.         return WpfLoadFat();
  112. }
复制代码


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-1-24 19:13

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表