通用文件操作类的设计
来源:互联网 发布:linux pts节点 编辑:程序博客网 时间:2024/06/03 15:59
Windows环境下读写文件一般有下列有下面几种方式:C语言的文件操作函数,如fopen函数等,C++的I/O流库,Win32 API的文件操作函数,如CreateFile()、WriteFile()、ReadFile(),MFC的文件操作类,如CFile和CStdioFile等等。但是在大型的数据文件,上面的文件处理方法是不太适合的。对于大文件的操作一般是以内存映射文件来加以处理的。为此本人以读取著名的遥感图像文件格式pix文件来说明如何应用内存文件映射来设计一个通用的文件操作类。
* 文件名: Pix.h
* 作者 : 朱金灿
* 日期 : 08.05.15
* 文件描述:pix文件操作类声明
*/
class __declspec(dllexport) CPix : public CObject
{
public:
CPix(void);
~CPix(void);
// operation 打开操作
public:
// 打开pix文件,获取文件头信息
BOOL OpenForFileHead(char* pszFileName);
// 打开pix文件,获取通道信息
BOOL OpenForImgHeader(char* pszFileName);
public:
// 释放内存
BOOL Close();
private:
// 获取所映射的那段内存的起始地址
BOOL GetMapViewAddress(char* pszFileName);
private:
// pix文件头,限于版权原因,此结构体不公开
FileHeader_t m_FileHeader;
// 通道信息头指针,限于版权原因,此结构体不公开
ImageHeader_t *m_pImageHeader;
// 内存映射文件的起始位置
LPBYTE m_pbFile;
HANDLE m_hFileHandle;
HANDLE m_hFileMapping;
};
/*
* 文件名: Pix.cpp
* 作者 : 朱金灿
* 日期: 08.05.15
* 文件描述:pix文件操作类实现
*/
CPix::CPix(void)
{
m_pImageHeader = NULL;
m_hFileHandle = NULL;
m_hFileMapping = NULL;
m_pbFile = NULL;
m_pImageHeader = NULL;
}
CPix::~CPix(void)
{
Close();
}
/*================================================================
*
* 函数名:GetMapViewAddress
*
* 参 数:
*
* [IN] char* pszFileName ---- 输入文件名
*
* 功能描述:
*
* 进行内存文件映射,获取所映射内存基地址
*
* 返回值:成功TRUE,失败FALSE
*
* 抛出异常:
*
* 作 者:朱金灿 08.05.15.
*
================================================================*/
BOOL CPix::GetMapViewAddress(char* pszFileName)
{
m_hFileHandle = ::CreateFile(pszFileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if( INVALID_HANDLE_VALUE == m_hFileHandle )
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
AfxMessageBox((LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
return FALSE;
}
DWORD dwError = 0;
LARGE_INTEGER li;
li.LowPart = GetFileSize( m_hFileHandle, (unsigned long*)(&li.HighPart));
if (li.LowPart == INVALID_FILE_SIZE && (dwError = GetLastError()) != NO_ERROR )
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
AfxMessageBox((LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
return FALSE;
}
m_hFileMapping = CreateFileMapping( m_hFileHandle,
NULL,
PAGE_READWRITE,li.HighPart, li.LowPart,NULL);
if( INVALID_HANDLE_VALUE == m_hFileMapping )
{
CloseHandle( m_hFileHandle );
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
AfxMessageBox((LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
return FALSE;
}
__int64 qwFileOffset = 0;
m_pbFile = static_cast<LPBYTE>(MapViewOfFile(m_hFileMapping,
FILE_MAP_ALL_ACCESS,(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset&0xFFFFFFFF),0));
if (NULL==m_pbFile)
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
AfxMessageBox((LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
return FALSE;
}
return TRUE;
}
/*================================================================
*
* 函数名:OpenForFileHead
*
* 参 数:
*
* [IN] char* pszFileName ---- 输入文件名
*
* 功能描述:
*
* 打开文件,获取文件头信息
*
* 返回值:成功TRUE,失败FALSE
*
* 抛出异常:
*
* 作 者:朱金灿 08.05.15.
*
================================================================*/
BOOL CPix::OpenForFileHead(char* pszFileName)
{
if (!GetMapViewAddress(pszFileName))
{
return FALSE;
}
memcpy(&m_FileHeader,m_pbFile,sizeof(FileHeader_t));
return TRUE;
}
/*================================================================
*
* 函数名:OpenForImgHeader
*
* 参 数:
*
* [IN] char* pszFileName ---- 输入文件名
*
* 功能描述:
*
* 打开文件,获取各个通道信息
*
* 返回值:成功TRUE,失败FALSE
*
* 抛出异常:
*
* 作 者:朱金灿 08.05.15.
*
================================================================*/
BOOL CPix::OpenForImgHeader(char* pszFileName)
{
if(!OpenForFileHead(pszFileName))
return FALSE;
int nBandNum=atoi(m_FileHeader.Channels);
m_pImageHeader = new ImageHeader_t[nBandNum];
if (NULL==m_pImageHeader)
{
AfxMessageBox("开辟内存失败");
return FALSE;
}
for (int i =0;i<nBandNum;i++)
{
memcpy(&m_pImageHeader[i],m_pbFile+sizeof(FileHeader_t)+i*sizeof(ImageHeader_t),sizeof(ImageHeader_t));
}
return TRUE;
}
/*================================================================
*
* 函数名:Close
*
* 参 数:
*
*
*
* 功能描述:
*
* 撤销文件数据映像,释放相关内存
*
* 返回值:成功TRUE,失败FALSE
*
* 抛出异常:
*
* 作 者:朱金灿 08.05.15.
*
================================================================*/
BOOL CPix::Close()
{
delete m_pImageHeader;
UnmapViewOfFile(m_pbFile);
if (NULL!=m_hFileHandle)
{
if(!CloseHandle(m_hFileHandle))
return FALSE;
}
if (NULL!=m_hFileMapping)
{
if(CloseHandle(m_hFileHandle))
return FALSE;
}
return TRUE;
}
多技术文章请参看施昌权的个人网站: http://www.joyvc.cn
- 通用文件操作类的设计
- 通用文件操作类的设计
- 通用文件操作类的设计
- VB经典:操作.ini文件的通用类源代码
- JAVA实现对文件操作的通用类
- c#操作XML文件的通用方法
- c#操作XML文件的通用方法
- c#操作XML文件的通用方法
- python3 文件的读取和通用操作
- asp.net 通用文件操作类
- android通用文件操作
- 一个绝对经典的在VB中操作.ini文件的通用类源代码
- 在VB.net中操作.ini文件的通用类源代码
- linux中通用GPIO接口的操作--文件IO方式
- 通用的对URL操作的类
- 通用设计的原则
- 通用的设计模式
- 通用的数据库增删改操作类
- 腾讯面试题
- FreeEIM 与飞鸽传书的区别
- 同步电机与异步电机的区别(zz)
- 在VC++应用程序中读取文本数据
- 飞鸽传书软件新闻
- 通用文件操作类的设计
- Windows Socket 网络编程(一) —— TCP/IP体系结构、特点及相关术语
- 一些关于性能测试的资料
- Oracle分布式系统数据复制技术
- 彻底明白Java的IO系统
- 编写跨平台的Java程序
- 求教
- 采集网站用户行为的免费工具
- [她是你的妻子]