VC++中使用内存映射文件处理大文件(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);
}
位律师回复
0条评论