記憶體映射的小例子

來源:互聯網
上載者:User

bool CopyThread::copyFileDW(const QString& orgPath, QString tarPath)<br />{<br />// source file<br />HANDLE hIn = CreateFile(orgPath.toStdWString().c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br />if ( INVALID_HANDLE_VALUE == hIn )<br />{<br />return false;<br />}<br />HANDLE hInMapFile = CreateFileMapping(hIn, NULL, PAGE_READWRITE, 0, 0, NULL);<br />if ( INVALID_HANDLE_VALUE == hInMapFile )<br />{<br />CloseHandle(hIn);<br />return false;<br />}<br />DWORD dwInFileSizeHigh = 0;<br />__int64 qwInFileSize = GetFileSize(hIn, &dwInFileSizeHigh);<br />qwInFileSize |= (((__int64)dwInFileSizeHigh) << 32);<br />CloseHandle(hIn);</p><p>// dest file<br />HANDLE hOut = CreateFile(tarPath.toStdWString().c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);<br />if ( INVALID_HANDLE_VALUE == hOut )<br />{<br />CloseHandle(hInMapFile);<br />return false;<br />}<br />HANDLE hOutMapFile = CreateFileMapping(hOut, NULL, PAGE_READWRITE, (DWORD)(qwInFileSize>>32),(DWORD)(qwInFileSize & 0xFFFFFFFF), NULL);<br />if ( INVALID_HANDLE_VALUE == hOutMapFile )<br />{<br />CloseHandle(hInMapFile);<br />CloseHandle(hOut);<br />return false;<br />}<br />DWORD dwOutFileSizeHigh = 0;<br />__int64 qwOutFileSize = GetFileSize(hOut, &dwOutFileSizeHigh);<br />qwOutFileSize |= (((__int64)dwOutFileSizeHigh) << 32);<br />CloseHandle(hOut);</p><p>__int64 qwFileOffset = 0;<br />SYSTEM_INFO sinf;<br />GetSystemInfo(&sinf);<br />DWORD dwBlock = 1000*sinf.dwAllocationGranularity;<br />float fPercent = 0.0f;<br />LPBYTE pInMapAddress = NULL;<br />LPBYTE pOutMapAddress = NULL;<br />while(qwInFileSize > 0)<br />{<br />if(!m_bCopying)<br />{<br />CloseHandle(hInMapFile);<br />CloseHandle(hOutMapFile);<br />return false;<br />}</p><p>if(qwInFileSize < dwBlock)<br />dwBlock = (DWORD)qwInFileSize;<br />pInMapAddress = (LPBYTE)MapViewOfFile(hInMapFile, FILE_MAP_READ, (DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset & 0xFFFFFFFF), dwBlock);<br />if(NULL == pInMapAddress)<br />break;<br />pOutMapAddress = (LPBYTE)MapViewOfFile(hOutMapFile, FILE_MAP_WRITE, (DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset & 0xFFFFFFFF), dwBlock);<br />if(NULL == pOutMapAddress)<br />break;<br />CopyMemory(pOutMapAddress, pInMapAddress, dwBlock);<br />UnmapViewOfFile(pInMapAddress);<br />UnmapViewOfFile(pOutMapAddress);<br />qwFileOffset += dwBlock;<br />qwInFileSize -= dwBlock;<br />mcopysize += dwBlock;</p><p>fPercent = (float)mcopysize/mFileSize;<br />fPercent = qBound(0.0f, fPercent, 1.0f);<br />// 向主線程彙報<br />emit sig_updateProgress(fPercent);<br />}<br />if(NULL != pInMapAddress)<br />UnmapViewOfFile(pInMapAddress);<br />if(NULL != pOutMapAddress)<br />UnmapViewOfFile(pOutMapAddress);<br />CloseHandle(hInMapFile);<br />CloseHandle(hOutMapFile);<br />return true;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.