181 lines
5.5 KiB
C++
181 lines
5.5 KiB
C++
#ifndef _WYL_FILESTREAM_H_
|
||
#define _WYL_FILESTREAM_H_
|
||
|
||
|
||
/******************************************************************
|
||
*
|
||
* wyLib库 2008 - 2010
|
||
*
|
||
* $ 数据流库 $
|
||
*
|
||
* - 主要功能 -
|
||
*
|
||
* 具有基本的数据流操作功能,写入、读取、调整流指针等基本操作和功能
|
||
* 目前具有CFileStream、CMemoryStream等常用流类
|
||
*
|
||
*****************************************************************/
|
||
|
||
#include "_osdef.h"
|
||
|
||
namespace wylib
|
||
{
|
||
namespace stream
|
||
{
|
||
#ifndef WIN32
|
||
//#define INVALID_HANDLE_VALUE ((LONG_PTR)-1)
|
||
#endif
|
||
|
||
/* 基础抽象流
|
||
流的基础类,提供流最基本的虚函数接口声明
|
||
*/
|
||
class CBaseStream
|
||
{
|
||
public:
|
||
enum StreamSeekOrigin
|
||
{
|
||
soBeginning = 0, //从流的起点开始
|
||
soCurrent = 1, //从流的当前位置开始
|
||
soEnd = 2, //从流的末尾开始
|
||
};
|
||
private:
|
||
public:
|
||
CBaseStream(){};
|
||
virtual ~CBaseStream(){};
|
||
|
||
//获取流大小
|
||
virtual LONGLONG getSize();
|
||
//设置流大小
|
||
virtual bool setSize(LONGLONG tSize){ return false; };
|
||
//获取流中当前指针位置
|
||
inline LONGLONG getPosition(){ return seek( 0, soCurrent ); };
|
||
//设置流当前指针位置
|
||
LONGLONG setPosition(const LONGLONG tPosition);
|
||
//调整流指针位置tOffset参数表示调整的长度,
|
||
//Origin参数表示调整的启示位置,其值应当是StreamSeekOrigin枚举类型中的值
|
||
virtual LONGLONG seek(const LONGLONG tOffset, const int Origin) = 0;
|
||
//从流中读取数据lpBuffer为读取缓冲区,tSizeToRead为读取的字节数
|
||
//如果读取失败,则函数返回-1,否则函数返回实际从流中读取的字节数
|
||
virtual LONGLONG read(LPVOID lpBuffer, const LONGLONG tSizeToRead) = 0;
|
||
//向流中写入数据lpBuffer为写入数据内容指针,tSizeToWrite为写入的字节数
|
||
//如果写入失败,则函数返回-1,否则函数返回实际写入流中的字节数
|
||
virtual LONGLONG write(LPCVOID lpBuffer, const LONGLONG tSizeToWrite) = 0;
|
||
//从另一个流中拷贝数据lpStream为另一个流对象指针,tSizeToCopy表示拷贝的字节数
|
||
//从lpStream中拷贝的数据的起始位置是lpStream的当前指针位置
|
||
//若参数tSizeToCopy为0则表示拷贝lpStream整个流的数据
|
||
virtual LONGLONG copyFrom(CBaseStream& stream, LONGLONG tSizeToCopy = 0);
|
||
};
|
||
|
||
|
||
|
||
/* 句柄流,
|
||
流操作的数据是针对外部提供的句柄进行的
|
||
*/
|
||
class CHandleStream
|
||
: public CBaseStream
|
||
{
|
||
public:
|
||
typedef CBaseStream Inherited;
|
||
protected:
|
||
#ifdef WIN32
|
||
HANDLE m_hHandle;
|
||
void setHandle(HANDLE Handle);
|
||
public:
|
||
CHandleStream(HANDLE StreamHandle);
|
||
inline HANDLE getHandle(){ return m_hHandle; }
|
||
inline bool handleValid(){ return m_hHandle != INVALID_HANDLE_VALUE; }
|
||
#else
|
||
int m_hHandle;
|
||
void setHandle(int Handle);
|
||
public:
|
||
CHandleStream(int StreamHandle);
|
||
inline int getHandle(){ return m_hHandle; }
|
||
inline bool handleValid(){ return m_hHandle != INVALID_HANDLE_VALUE; }
|
||
#endif
|
||
bool setSize(LONGLONG tSize);
|
||
LONGLONG seek(const LONGLONG tOffset, const int Origin);
|
||
LONGLONG read(LPVOID lpBuffer, const LONGLONG tSizeToRead);
|
||
LONGLONG write(LPCVOID lpBuffer, const LONGLONG tSizeToWrite);
|
||
};
|
||
|
||
|
||
/* 文件流,
|
||
对文件系统中的文件读写操作的类
|
||
*/
|
||
class CFileStream
|
||
: public CHandleStream
|
||
{
|
||
public:
|
||
typedef CHandleStream Inherited;
|
||
//文件的打开方式
|
||
enum FileAccessType
|
||
{
|
||
faRead = 0x0001, //读取
|
||
faWrite = 0x0002, //写入
|
||
faCreate = 0x1000, //创建
|
||
|
||
faShareRead = 0x0100, //读共享
|
||
faShareWrite = 0x0200, //写共享
|
||
faShareDelete = 0x0400, //删除共享
|
||
};
|
||
//win32文件创建的模式
|
||
enum OpenDisposition
|
||
{
|
||
CreateIfNotExists = 1, //文件不存在则创建
|
||
AlwaysCreate, //总是创建文件,如果文件存在则将文件截断为0字节
|
||
OpenExistsOnly, //仅打开存在的文件
|
||
AlwaysOpen, //总是打开文件,若文件存在则直接打开,否则尝试创建文件并打开
|
||
TruncExistsOnly, //如果文件存在则打开文件并截断为0字节
|
||
};
|
||
private:
|
||
LPTSTR m_sFileName;
|
||
protected:
|
||
void setFileName(LPCTSTR lpFileName);
|
||
void construct(LPCTSTR lpFileName, DWORD dwAccessType, DWORD dwWin32CreationDisposition);
|
||
public:
|
||
CFileStream(LPCTSTR lpFileName, DWORD dwAccessType);
|
||
CFileStream(LPCTSTR lpFileName, DWORD dwAccessType, OpenDisposition eWin32CreateionDisposition);
|
||
~CFileStream();
|
||
|
||
inline LPCTSTR getFileName(){ return m_sFileName; }
|
||
};
|
||
|
||
|
||
/* 内存流
|
||
使用内存作为数据存储区的流对象类
|
||
*/
|
||
class CMemoryStream
|
||
: public CBaseStream
|
||
{
|
||
public:
|
||
typedef CBaseStream Inherited;
|
||
|
||
private:
|
||
char *m_pMemory; //内存块指针
|
||
char *m_pPointer; //流指针
|
||
char *m_pStreamEnd; //文件尾指针
|
||
char *m_pMemoryEnd; //内存块结束地址指针
|
||
protected:
|
||
//如果需要处理内存申请和释放相关事宜,则在继承类中覆盖此函数即可
|
||
virtual char* Alloc(char* ptr, const LONGLONG size);
|
||
|
||
public:
|
||
CMemoryStream();
|
||
~CMemoryStream();
|
||
|
||
bool setSize(LONGLONG tSize);
|
||
LONGLONG seek(const LONGLONG tOffset, const int Origin);
|
||
LONGLONG read(LPVOID lpBuffer, const LONGLONG tSizeToRead);
|
||
LONGLONG write(LPCVOID lpBuffer, const LONGLONG tSizeToWrite);
|
||
|
||
//获取内存流的内存块指针
|
||
inline LPVOID getMemory(){ return m_pMemory; }
|
||
//从文件加流数据到内存
|
||
LONGLONG loadFromFile(LPCTSTR lpFileName);
|
||
//将流数据保存到文件
|
||
LONGLONG saveToFile(LPCTSTR lpFileName);
|
||
};
|
||
};
|
||
};
|
||
|
||
#endif
|