VC++中使用内存映射文件处理大文件(2)

VC++中使用内存映射文件处理大文件(2),第1张

VC++中使用内存映射文件处理大文件(2),第2张

用内存映射文件处理大文件的应用实例

下面是一个具体的例子来进一步解释内存映射文件的使用。该实例从端口接收数据,并实时将其存储在磁盘中。因为数据量大(几十GB),这里选择内存映射文件进行处理。以下是位于工作线程MainProc中的一些主要代码,它在程序运行时启动。当数据到达端口时,将发出事件hEvent[0]。WaitForMultipleObjects()函数将在事件发生后将接收到的数据保存到磁盘。如果接收终止,将发出事件hEvent[1],事件处理进程将负责释放资源和关闭文件。该线程处理函数的具体实现过程如下:

……

//创建一个文件内核对象,其句柄保存在hFile中

HANDLE hFile = create file(" rec v1 . zip ",

泛型_WRITE |泛型_READ,

文件共享读取,

空,

创建_总是,

文件_标志_顺序_扫描,

NULL);

//创建一个文件映射内核对象,句柄保存在hFileMapping中。

HANDLE hFile mapping = create file mapping(hFile,NULL,PAGE_READWRITE,

0,0x4000000,NULL);

//释放文件内核对象

close handle(hFile);

//设置大小、偏移量等参数

_ _ int64 qwFileSize = 0x4000000

_ _ int 64 qwFileOffset = 0;

_ _ int 64T = 600 * sinf . dwallocationgranularity;

DWORD dwBytesInBlock = 1000 * sinf . dwallocationgranularity;

//将文件数据映射到进程的地址空

PBYTE Pb file =(PBYTE)MapViewOfFile(hFileMapping,

文件_地图_全部_访问,

(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),dwBytesInBlock);

while(bLoop)

{

//捕获事件hEvent[0]和事件hEvent[1]

DWORD ret = WaitForMultipleObjects(2,hEvent,FALSE,INFINITE);

ret-= WAIT _ OBJECT _ 0;

开关(复位)

{

//接收数据事件触发器

案例0:

//从端口接收数据并保存到内存映射文件

nReadLen=syio_Read(port[1],pbFile + qwFileOffset,queue len);

qwFileOffset+= nReadLen;

//当数据占满60%时,为了防止数据溢出,之后需要打开一个新的映射视图。

if (qwFileOffset > T)

{

t = qwFileOffset+600 * sinf . dwallocationgranularity;

UnmapViewOfFile(Pb file);

Pb file =(PBYTE)MapViewOfFile(hFileMapping,

文件_地图_全部_访问,

(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),dwBytesInBlock);

}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VC++中使用内存映射文件处理大文件(2)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情