vc中使用内存映射加快拷贝4g 大文件
时间: 2023-09-05 18:08:59 浏览: 61
内存映射是一种将文件或其他资源映射到内存中的技术,它可以使得对资源的访问变得更加高效。在 Windows 中,内存映射可以通过 CreateFileMapping 和 MapViewOfFile 函数实现。
下面给出一个使用内存映射加快拷贝4G大文件的示例代码:
```c++
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
HANDLE hFile = CreateFile("largefile.bin", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
cout << "Failed to open file" << endl;
return 1;
}
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMapping == NULL) {
cout << "Failed to create file mapping" << endl;
CloseHandle(hFile);
return 1;
}
LPVOID pView = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
if (pView == NULL) {
cout << "Failed to map file view" << endl;
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
HANDLE hOutFile = CreateFile("largefile_copy.bin", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOutFile == INVALID_HANDLE_VALUE) {
cout << "Failed to create output file" << endl;
UnmapViewOfFile(pView);
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
DWORD fileSizeLow = GetFileSize(hFile, NULL);
DWORD fileSizeHigh = 0;
DWORD fileSize = (fileSizeHigh << 32) | fileSizeLow;
DWORD bytesWritten = 0;
if (!WriteFile(hOutFile, pView, fileSize, &bytesWritten, NULL)) {
cout << "Failed to write output file" << endl;
CloseHandle(hOutFile);
UnmapViewOfFile(pView);
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
cout << "File copied successfully" << endl;
CloseHandle(hOutFile);
UnmapViewOfFile(pView);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;
}
```
该程序通过内存映射技术将 `largefile.bin` 文件映射到内存中,然后将映射的内存直接写入到 `largefile_copy.bin` 文件中,从而实现快速拷贝4G大文件的功能。需要注意的是,该程序只适用于4G以下的文件,对于更大的文件需要进行分块处理。