Files
mir_server/sdk/utils/Stream.h

181 lines
5.5 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _WYL_FILESTREAM_H_
#define _WYL_FILESTREAM_H_
/******************************************************************
*
* wyLib库 2008 - 2010
*
* $ $
*
* - -
*
*
* CFileStreamCMemoryStream等常用流类
*
*****************************************************************/
#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