windows記憶體映射

來源:互聯網
上載者:User

為了說明記憶體映射的使用方式,下面是個人寫的例子:

首先建立了一個大於2GB的檔案,並寫入一定量地測試資料,

代碼如下:

HANDLE hFile = CreateFile("media.mp3",<br />GENERIC_READ | GENERIC_WRITE,<br />0,<br />NULL,<br />OPEN_ALWAYS,<br />FILE_ATTRIBUTE_NORMAL,<br />NULL);<br />//TODO: change the size of the file.<br />if (hFile == INVALID_HANDLE_VALUE)<br />{<br />printf("failed in create file./n");<br />}<br />SYSTEM_INFO sysInfo;<br />memset(&sysInfo,0,sizeof(sysInfo));<br />GetSystemInfo(&sysInfo);<br />printf("system information/n");<br />printf("process number is:%d/n",sysInfo.dwNumberOfProcessors); //2<br />printf("allocation granularity is:%d/n",sysInfo.dwAllocationGranularity); //64KB<br />printf("page size is:%d/n",sysInfo.dwPageSize); //4KB<br />int retCode = 0;<br />DWORD distance = 1024 * 64 * 1024 * 10 * 10;<br />long highPart = 0;</p><p>retCode = SetFilePointer(hFile,distance,&highPart,FILE_CURRENT);<br />if (retCode == 0xFFFFFFFF)<br />{<br />printf("error code is:%d",GetLastError());<br />}<br />char buff[1000] ;<br />memset(buff,'E',100);<br />memset(buff+100,'F',100);<br />memset(buff+200,'G',100);<br />memset(buff+300,'H',100);<br />memset(buff+400,'I',100);<br />buff[999] = 0;<br />DWORD bytesWritten = 0;<br />OVERLAPPED owrite;<br />memset(&owrite,0,sizeof(owrite));<br />owrite.Offset = 1024 * 64 * 1024 * 10;<br />WriteFile(hFile,buff,1000,&bytesWritten,&owrite);<br />printf("%d bytest has been written!/n",bytesWritten);<br />CloseHandle(hFile); 

 

然後讀取檔案中的資料測試,代碼如下:

HANDLE hFile = CreateFile("media.mp3",<br />GENERIC_READ | GENERIC_WRITE,<br />0,<br />NULL,<br />OPEN_ALWAYS,<br />FILE_ATTRIBUTE_NORMAL,<br />NULL);<br />char buff[1000];<br />memset(buff,0,1000);<br />DWORD bytesRead = 0;<br />SetFilePointer(hFile,1,NULL,FILE_BEGIN);<br />OVERLAPPED oread;<br />memset(&oread,0,sizeof(oread));<br />oread.Offset = 1024 * 64 * 1024 * 10;<br />ReadFile(hFile,buff,1000,&bytesRead,&oread);<br />printf("%s/n",buff);<br />getchar();<br />CloseHandle(hFile); 

 

最後採用記憶體映射的方式對這個大檔案中的字串翻轉,並讀取字串測試,

代碼如下:

HANDLE hFile = CreateFile("media.mp3",<br />GENERIC_READ | GENERIC_WRITE,<br />FILE_SHARE_READ | FILE_SHARE_WRITE,<br />NULL,<br />OPEN_EXISTING,<br />FILE_ATTRIBUTE_NORMAL,<br />NULL);<br />if (hFile == INVALID_HANDLE_VALUE)<br />{<br />printf("invalid handle value/n");<br />}<br />DWORD fileSize = GetFileSize(hFile,NULL);<br />printf("file size is: %f GB/n",((fileSize/1024.0)/1024.0)/1024.0);<br />HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,<br />0,0,NULL);<br />if (hFileMap == NULL)<br />{<br />printf("create file mapping object failed./n");<br />}<br />else<br />{<br />DWORD dwNumberOfBytesToMap = 1024 * 64 * 1024 * 10;<br />DWORD dwNum = 0;<br />DWORD64 offset = 0;<br />while (fileSize)<br />{<br />dwNum = dwNumberOfBytesToMap > fileSize? fileSize : dwNumberOfBytesToMap;</p><p>LPVOID pvFile = MapViewOfFile(hFileMap,FILE_MAP_WRITE,offset>>32,offset&0xffffffff,dwNum);<br />if (pvFile == NULL)<br />{<br />printf("create map view of file is failed, error code is :%d",GetLastError());<br />}<br />else<br />{<br />fileSize -= dwNum;<br />offset += dwNum;<br />PSTR pchAnsi = (PSTR)pvFile;<br />pchAnsi[dwNum/sizeof(char) - 1] = 0;<br />_strrev(pchAnsi);<br />UnmapViewOfFile(pvFile);<br />}<br />}</p><p>CloseHandle(hFileMap);<br />}<br />CloseHandle(hFile);<br />HANDLE hFile1 = CreateFile("media.mp3",<br />GENERIC_READ | GENERIC_WRITE,<br />0,<br />NULL,<br />OPEN_EXISTING,<br />FILE_ATTRIBUTE_NORMAL,<br />NULL);<br />OVERLAPPED oRead;<br />memset(&oRead,0,sizeof(oRead));<br />oRead.Offset = 1024 * 64 * 1024 * 10;<br />char buff[1000];<br />DWORD bytesRead = 0;<br />memset(buff,0,1000);<br />ReadFile(hFile1,buff,1000,&bytesRead,&oRead);<br />printf("%s/n",buff);</p><p>CloseHandle(hFile1);<br /> 

在記憶體映射時,採用多次MapViewOfFile將大檔案分開多次映射到記憶體中,

這樣就不會因為記憶體不足,而得到5這個錯誤了。

 

以上基本說明了windows記憶體映射的使用方法,過程中一定要注意參數的使用方式,

以上僅僅是片面說明了問題 。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.