java 内存映射文件 主要应用_VC++中使用内存映射文件处理大文件(3)
……
// 創(chuàng)建文件內(nèi)核對象,其句柄保存于hFile
HANDLE hFile = CreateFile("Recv1.zip",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 創(chuàng)建文件映射內(nèi)核對象,句柄保存于hFileMapping
HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,
0, 0x4000000, NULL);
// 釋放文件內(nèi)核對象
CloseHandle(hFile);
// 設(shè)定大小、偏移量等參數(shù)
__int64 qwFileSize = 0x4000000;
__int64 qwFileOffset = 0;
__int64 T = 600 * sinf.dwAllocationGranularity;
DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity;
// 將文件數(shù)據(jù)映射到進(jìn)程的地址空間
PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock);
while(bLoop)
{
// 捕獲事件hEvent[0]和事件hEvent[1]
DWORD ret = WaitForMultipleObjects(2, hEvent, FALSE, INFINITE);
ret -= WAIT_OBJECT_0;
switch (ret)
{
// 接收數(shù)據(jù)事件觸發(fā)
case 0:
// 從端口接收數(shù)據(jù)并保存到內(nèi)存映射文件
nReadLen=syio_Read(port[1], pbFile + qwFileOffset, QueueLen);
qwFileOffset += nReadLen;
// 當(dāng)數(shù)據(jù)寫滿60%時,為防數(shù)據(jù)溢出,需要在其后開辟一新的映射視圖
if (qwFileOffset > T)
{
T = qwFileOffset + 600 * sinf.dwAllocationGranularity;
UnmapViewOfFile(pbFile);
pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock);
}
break;
// 終止事件觸發(fā)
case 1:
bLoop = FALSE;
// 從進(jìn)程的地址空間撤消文件數(shù)據(jù)映像
UnmapViewOfFile(pbFile);
// 關(guān)閉文件映射對象
CloseHandle(hFileMapping);
break;
}
}
…
總結(jié)
以上是生活随笔為你收集整理的java 内存映射文件 主要应用_VC++中使用内存映射文件处理大文件(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm ssh mysql_Py
- 下一篇: oracle user does not