MFC使用文件映射的详细代码和讲解
时间: 2024-05-13 19:16:18 浏览: 9
文件映射是一种高效且灵活的文件操作方式,MFC提供了一些API来实现文件映射,下面是一个详细的文件映射示例代码:
```cpp
// 定义文件映射类
class CFileMapping
{
public:
CFileMapping();
virtual ~CFileMapping();
// 创建文件映射
BOOL Create(LPCTSTR lpszFileName, DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE, DWORD dwFileOffset = 0, DWORD dwNumberOfBytesToMap = 0);
// 关闭文件映射
void Close();
// 获取文件映射指针
LPVOID GetDataPtr() const;
// 获取文件映射大小
DWORD GetFileSize() const;
private:
HANDLE m_hFile; // 文件句柄
HANDLE m_hFileMapping; // 文件映射句柄
LPVOID m_lpFileData; // 文件映射指针
DWORD m_dwFileSize; // 文件映射大小
};
CFileMapping::CFileMapping()
: m_hFile(INVALID_HANDLE_VALUE)
, m_hFileMapping(NULL)
, m_lpFileData(NULL)
, m_dwFileSize(0)
{
}
CFileMapping::~CFileMapping()
{
Close();
}
BOOL CFileMapping::Create(LPCTSTR lpszFileName, DWORD dwDesiredAccess, DWORD dwFileOffset, DWORD dwNumberOfBytesToMap)
{
// 打开文件
m_hFile = ::CreateFile(lpszFileName, dwDesiredAccess, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
TRACE(_T("Failed to open file '%s'\n"), lpszFileName);
return FALSE;
}
// 获取文件大小
m_dwFileSize = ::GetFileSize(m_hFile, NULL);
// 创建文件映射
m_hFileMapping = ::CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, dwNumberOfBytesToMap, NULL);
if (m_hFileMapping == NULL)
{
TRACE(_T("Failed to create file mapping for file '%s'\n"), lpszFileName);
Close();
return FALSE;
}
// 获取文件映射指针
m_lpFileData = ::MapViewOfFile(m_hFileMapping, FILE_MAP_WRITE, 0, dwFileOffset, dwNumberOfBytesToMap);
if (m_lpFileData == NULL)
{
TRACE(_T("Failed to map file '%s' to memory\n"), lpszFileName);
Close();
return FALSE;
}
return TRUE;
}
void CFileMapping::Close()
{
if (m_lpFileData != NULL)
{
::UnmapViewOfFile(m_lpFileData);
m_lpFileData = NULL;
}
if (m_hFileMapping != NULL)
{
::CloseHandle(m_hFileMapping);
m_hFileMapping = NULL;
}
if (m_hFile != INVALID_HANDLE_VALUE)
{
::CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
}
m_dwFileSize = 0;
}
LPVOID CFileMapping::GetDataPtr() const
{
return m_lpFileData;
}
DWORD CFileMapping::GetFileSize() const
{
return m_dwFileSize;
}
```
使用该类可以很方便地进行文件映射操作:
```cpp
CFileMapping fileMapping;
if (fileMapping.Create(_T("test.dat"), GENERIC_READ | GENERIC_WRITE, 0, 0))
{
LPBYTE lpData = (LPBYTE)fileMapping.GetDataPtr();
DWORD dwSize = fileMapping.GetFileSize();
// 在lpData指向的内存块中进行文件操作,例如写入数据
::memset(lpData, 0, dwSize);
// 关闭文件映射
fileMapping.Close();
}
```
在上述示例中,`Create`方法用于创建文件映射,其中`lpszFileName`参数表示文件名,`dwDesiredAccess`参数表示访问权限,`dwFileOffset`参数表示文件偏移量,`dwNumberOfBytesToMap`参数表示映射的字节数,如果该参数为0,则表示映射整个文件。`GetDataPtr`方法用于获取文件映射指针,`GetFileSize`方法用于获取文件映射大小。`Close`方法用于关闭文件映射。
需要注意的是,在使用完文件映射后必须调用`Close`方法来关闭文件映射,否则可能会导致内存泄漏等问题。此外,对于映射到的内存进行操作时,需要注意内存边界等问题,以免发生访问越界等错误。