6997|20

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

内存映射文件 [复制链接]

谁在EVC 中实现过内存映射文件?我想将数据保存到配置文件中.用文件操作的方式,数据很多的时候,速度会很慢.现在我想试一下内存映射方式,不知道如何通过内存映射文件来操作配置文件,请大家发表意见.

最新回复

s.GetBuffer(s.GetLength())是宽字符 可以转化成multibyte再保存,或者直接用memcpy保存  详情 回复 发表于 2008-5-12 10:44
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
CreateFileForMapping、CreateFileMapping系列函数,在MSDN里有些简单的例子可参考下。
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我是把配置做成xml,然后映射这个xml文件。

你也可以按固定格式写一个ini文件。

操作方式是一样的。

下面是部分代码
[code]
LPVOID   lpRet   =   NULL;   
                if(lpdwFileLen)   
                        *lpdwFileLen   =   0;   
                ::SetLastError(0);   
                __try   
                {   
                        t_hFile   =   ::CreateFileForMapping(lpszFile2Map,GENERIC_WRITE|GENERIC_READ,   
                                FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);   
                        if(t_hFile == INVALID_HANDLE_VALUE)   
                        {   
                                int err ;
                                t_hFileMap   =   ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUFFER_LENGTH, L"mty95190");
                                err = ::GetLastError();       
                                if(!t_hFileMap)   
                                        __leave;   

                                if( err  ==   ERROR_ALREADY_EXISTS)   
                                {   
                                        lpRet   =   ::MapViewOfFile(t_hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);  
                                }
                                else
                                        __leave;   
                        }   
                        else
                        {
                                int err;
                                int size = ::GetFileSize(t_hFile, NULL);
                                t_hFileMap   =   ::CreateFileMapping(t_hFile, NULL, PAGE_READWRITE, 0, BUFFER_LENGTH, L"mty95190");   

                                err = ::GetLastError();       
                                if(!t_hFileMap)   
                                        __leave;   

                                if( err  ==   ERROR_ALREADY_EXISTS)   
                                {   
                                        lpRet   =   ::MapViewOfFile(t_hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);  
                                }
                                else
                                {
                                        lpRet   =   ::MapViewOfFile(t_hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);  
                                        if(size < BUFFER_LENGTH)
                                                ((BYTE*)lpRet)[size] = '\0';
                                }
                        }
                }   
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
哈哈,尽量使用一次性写入的方式,尽量减少打开和关闭文件的操作.

        //创建文件
        HANDLE hFile = CreateFileForMapping(_T("MYTEST.txt"),GENERIC_READ | GENERIC_WRITE,0,NULL,
                                          OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
        ASSERT(hFile != 0);

        DWORD dwLenFile = GetFileSize(hFile,NULL);

        //创建内存文件对象
        HANDLE hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,dwLenFile,L"MyMappingFile");
        ASSERT(hMapFile != 0);
       
        //获取内存映射文件对象视图
        LPSTR pData = (LPSTR)MapViewOfFile(hMapFile,FILE_MAP_WRITE,0,0,dwLenFile);
        ASSERT(pData != NULL);

        //*****操作*****
       
        char *pReadBuf = new char[dwLenFile+1];
        strcpy(pReadBuf,pData);
       
        pReadBuf[0] = '5';
        pReadBuf[1] = '2';
        pReadBuf[2] = '0';

        strcpy(pData,pReadBuf);
        //*****关闭*****
        //取消视图
        UnmapViewOfFile(pData);

        //关闭映射文件
        CloseHandle(hMapFile);
       
        //关闭文件
        CloseHandle(hFile);
        delete[] pReadBuf;

        ::GetLocalTime(&Time1);
        //char *m_szSYSTime = new char[10];               
        sprintf(m_szSYSTime, "%02d:%02d:%03d",Time1.wMinute,Time1.wSecond,Time1.wMilliseconds);
        this->UpdateData(TRUE);
        this->m_sticEnd = m_szSYSTime;
        this->UpdateData(FALSE);

        delete[] m_szSYSTime;
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
使用内存映射文件如何进行指针移动,数据删除,添加,修改等等操作
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
对其的操作就是和普通内存的操作一致。

不过在操作前最好把其内容按你自定义的格式解析到另一个内存中。

然后在另一个内存中进行数据的操作。

然后需要保存数据时,再把内容写回到初始的内存中,就可以了。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
我用的是ce4.2 ,给段代码学习一下吧!
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(初级)

8
 
大家都说的详细了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(中级)

9
 
我的代码就是4.2下的啊~~ 楼主怎么就不试试呢?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
我执行了这段代码,文件生成了,文件中为什么没有数据呢?
//创建文件
HANDLE hFile = CreateFileForMapping(_T("\\硬盘\\user.ini"),GENERIC_READ  | GENERIC_WRITE,0,NULL,
                          OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
ASSERT(hFile != 0);

DWORD dwLenFile = GetFileSize(hFile,NULL);

//创建内存文件对象
HANDLE hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,dwLenFile,L"MyMappingFile");
ASSERT(hMapFile != 0);

//获取内存映射文件对象视图
LPSTR pData = (LPSTR)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,dwLenFile);
ASSERT(pData != NULL);

//*****操作*****

char *pReadBuf = new char[dwLenFile+1];
strcpy(pReadBuf,pData);

pReadBuf[0] = '5';
pReadBuf[1] = '2';
pReadBuf[2] = '0';
//lstrcpy(m_pMapPointer,buf);
strcpy(pData,pReadBuf);
//*****关闭*****
//取消视图
UnmapViewOfFile(pData);

//关闭映射文件
CloseHandle(hMapFile);

//关闭文件
CloseHandle(hFile);
delete[] pReadBuf;
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
你最好不要使用文件的长度来分配内存
char *pReadBuf = new char[dwLenFile+1];  

如果你是新建文件那dwLenFile不就是0?


在关闭前执行一下flush操作

::FlushViewOfFile(pData,0);   
UnmapViewOfFile(pData);  
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
这句话也有问题
HANDLE hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,dwLenFile,L"MyMappingFile");  
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

13
 
对,红色部分要设置大一些,太小了的话,超出部分就不会被保存回去了。
这个的作用就是你需要对这个文件设置多大。超出部分自动截断。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
现在我要实时的记录数据,数据长度不固定,应该如何实现,思考中,请指点.
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
计算一个可以接受的最大值
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
如果我分配最大值,如何初始化这部分内存呢?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

17
 
这个你不用管。

http://www.developer.com/ws/pc/article.php/3312581
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

18
 
你按格式写成xml文件,那部分代码,可不可以贴出来学习一下?
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

19
 
我现在想把我要写入的信息按配置文件格式写入,应该怎么处理?

这是我初始代码?
        //创建文件
         m_hFile = CreateFileForMapping(m_MapName,GENERIC_READ  | GENERIC_WRITE,0,NULL,
                                                          OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
        ASSERT(hFile != 0);

        //DWORD dwLenFile = GetFileSize(m_hFile,NULL);

        //创建内存文件对象
        m_hMapFile = CreateFileMapping(m_hFile,NULL,PAGE_READWRITE,0,m_MaxSize,_T("MyMapFile"));
        ASSERT(hMapFile != 0);

        //获取内存映射文件对象视图
        m_pData = (LPSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,m_MaxSize);
        ASSERT(m_pData != NULL);
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
主要是生成CSting 类型的字符串后,怎么保存到内存当中!我试过字符串转化出了问题?
        CString s("addfasdfasdfasdf");

        strcpy(m_pData,s.GetBuffer(s.GetLength()));

error C2664: 'strcpy' : cannot convert parameter 2 from 'const unsigned short *' to 'const char *'
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表