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 />}