有谁进行过内存文件的操作么(见者有份)? 提供一些方法吧。//bow 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将文件映射到内存,然后对内存操作,但操作方法就和文件一样,用来解决文件反复读取文件导致的速度下降问题。如果你说的就是这个。那方法如下:调用CreateFile打开您想要映射的文件。 调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。 调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。 用该指针来读写文件。 调用UnmapViewOfFile来解除文件映射。 调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。 调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。 =fly by= 使用CMemFile,与CFile类相似,非常简单. ==============资料===============如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字符串刚好超过内存块的边界又该如何处理?对于第一个问题,您也许会说,只要不断地读就不解决了吗。至于第二个问题,您又会说在内存块的边界处做一些特别的处理,譬如放上一些标志位就可以了。原理上确实是行得通,但是这随问题复杂程度加深而显得非常难以处理。其中的第二个问题是有名的边界判断问题,程序中许许多多的错误都是由此引起。想一想,如果我们能够分配一个能够容纳整个文件的大内存块该多好啊,这样这两个问题不都迎刃而解了吗?是的,WIN32的内存映射文件确实允许我们分配一个装得下现实中可能存在的足够大的文件的内存。利用内存映射文件您可以认为操作系统已经为您把文件全部装入了内存,然后您只要移动文件指针进行读写即可了。这样您甚至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您可以把这用作不同的进程之间共享数据的一种办法。运用内存映射文件实际上没有涉及实际的文件操作,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据甚至崩溃。本课中我们将主要讲述内存映射文件,将不涉及进程间的同步。WIN32中的内存映射文件应用非常广泛,譬如:即使是系统的核心模块---PE格式文件装载器也用到了内存映射文件,因为PE格式的文件并不是一次性加载到内存中来的,譬如他它在首次加载时只加载必需加载的部分,而其他部分在用到时再加载,这正好可以利用到内存映射文件的长处。实际中的大多数文件存取都和PE加载器类似,所以您在处理该类问题时也应该充分利用内存映射文件。内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操作是非常有用的。当然这并不意味着对于会引起改变其大小的文件操作就一定不能用内存影射文件的方法,您可以事先估计操作后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就可以增长到这么一个大小。 如果这个文件是我自己写入的不同类型的数据,比如int,long,char之类的,如果用序列化,可以简单的操作,但是使用内存映射文件,怎么操作好?这时候没法再用序列化读取了啊 我曾经作过一个关于大图片(400-80mb)处理的程序,用过内存映射文件操作的技术。我把部分代码粘过来,希望有用,如果不行的话,千万别骂我(^_^),仅供参考: m_hFile=CreateFile(pszPathName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//打开句柄 if(m_hFile==INVALID_HANDLE_VALUE) { Release(); return 0; } DWORD fileSize=GetFileSize(m_hFile,NULL);//获取文件大小 m_hFileMap=CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, fileSize, NULL);//产生内存映射文件,并打开内存映射文件句柄 if(m_hFileMap==NULL) { Release(); CloseHandle(m_hFile);//关闭 return 0; } //产生内存映射文件 //返回图象数据的地址 //可以快速在视图中显示图象 //通过移动m_pTDibs也可以很方便的实现快速漫游 //也可以快速显示测量图象中的某一块 //所有这些只需精确的定位中的地址 m_pTDibs=(LPBYTE)MapViewOfFile(m_hFileMap, FILE_MAP_WRITE, 0, 0, 0);//m_pTDibs是指向数据的指针 //映射文件,m_pTDibs指向文件数据的地址 if(m_pTDibs==NULL) { Release(); CloseHandle(m_hFile); CloseHandle(m_hFileMap); return 0; } socket客户端怎么开房间 新手请教一个socket的问题,谢谢! 利用MODEM拨号并进行传输文件。。大家帮帮忙 THX 怎么才能启动多个同样的用ATL编写的com服务程序? 小弟也想和大侠换c#程序学习 时间! 视频捕捉处理VCE 采集卡 请问用什么阅读工具可以打开一个后缀名为.001、.002之类的文件,急! C语言数组与指针 大家帮个忙。。。 完了完了,我的VC疯了。。!! 快来帮帮我,我在别的机器上用WINRAR压缩的文件怎么到我机器上就解不开啦?
如果你说的就是这个。那方法如下:调用CreateFile打开您想要映射的文件。
调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。
调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。
用该指针来读写文件。
调用UnmapViewOfFile来解除文件映射。
调用CloseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。
调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。 =fly by=
如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字符串刚好超过内存块的边界又该如何处理?对于第一个问题,您也许会说,只要不断地读就不解决了吗。至于第二个问题,您又会说在内存块的边界处做一些特别的处理,譬如放上一些标志位就可以了。原理上确实是行得通,但是这随问题复杂程度加深而显得非常难以处理。其中的第二个问题是有名的边界判断问题,程序中许许多多的错误都是由此引起。想一想,如果我们能够分配一个能够容纳整个文件的大内存块该多好啊,这样这两个问题不都迎刃而解了吗?是的,WIN32的内存映射文件确实允许我们分配一个装得下现实中可能存在的足够大的文件的内存。利用内存映射文件您可以认为操作系统已经为您把文件全部装入了内存,然后您只要移动文件指针进行读写即可了。这样您甚至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您可以把这用作不同的进程之间共享数据的一种办法。运用内存映射文件实际上没有涉及实际的文件操作,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据甚至崩溃。本课中我们将主要讲述内存映射文件,将不涉及进程间的同步。WIN32中的内存映射文件应用非常广泛,譬如:即使是系统的核心模块---PE格式文件装载器也用到了内存映射文件,因为PE格式的文件并不是一次性加载到内存中来的,譬如他它在首次加载时只加载必需加载的部分,而其他部分在用到时再加载,这正好可以利用到内存映射文件的长处。实际中的大多数文件存取都和PE加载器类似,所以您在处理该类问题时也应该充分利用内存映射文件。内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操作是非常有用的。当然这并不意味着对于会引起改变其大小的文件操作就一定不能用内存影射文件的方法,您可以事先估计操作后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就可以增长到这么一个大小。
m_hFile=CreateFile(pszPathName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);//打开句柄
if(m_hFile==INVALID_HANDLE_VALUE)
{
Release();
return 0;
}
DWORD fileSize=GetFileSize(m_hFile,NULL);//获取文件大小
m_hFileMap=CreateFileMapping(m_hFile,
NULL,
PAGE_READWRITE,
0,
fileSize,
NULL);//产生内存映射文件,并打开内存映射文件句柄
if(m_hFileMap==NULL)
{
Release();
CloseHandle(m_hFile);//关闭
return 0;
}
//产生内存映射文件
//返回图象数据的地址
//可以快速在视图中显示图象
//通过移动m_pTDibs也可以很方便的实现快速漫游
//也可以快速显示测量图象中的某一块
//所有这些只需精确的定位中的地址
m_pTDibs=(LPBYTE)MapViewOfFile(m_hFileMap,
FILE_MAP_WRITE,
0,
0,
0);//m_pTDibs是指向数据的指针
//映射文件,m_pTDibs指向文件数据的地址
if(m_pTDibs==NULL)
{
Release();
CloseHandle(m_hFile);
CloseHandle(m_hFileMap);
return 0;
}