📄 dcfile.cpp
字号:
#include "DCFile.h"
DCFile::DCFile()
{
strcpy(m_szFileName,"");
m_bOpenFlag = false;
m_lMaxTempLength = MAXTEMPLATEBUFFLEN;
m_iOpenMode = 0;
}
DCFile::~DCFile()
{
if (m_bOpenFlag)
CloseFile();
}
/**--------------------------------------------------------------
* @param pFileName : 文件名
* @param iMode : 文件的建立方式
* @return true : 成功,false : 失败
* @description 建立并打开文件<br>
方式 : O_CREAT | O_RDWR | O_BINARY | O_TRUNC
----------------------------------------------------------------*/
bool DCFile::CreateFile(char *pFileName)
{
return CreateFile(pFileName,O_CREAT | O_RDWR | O_BINARY | O_TRUNC);
}
/**--------------------------------------------------------------
* @param pFileName : 文件名
* @param iMode : 文件的建立方式
* @return true : 成功,false : 失败
* @description 建立并打开文件<br>
方式 : O_CREAT | O_RDWR | O_BINARY | O_TRUNC
----------------------------------------------------------------*/
bool DCFile::NewFile(char *pFileName)
{
return CreateFile(pFileName,O_CREAT | O_RDWR | O_BINARY | O_TRUNC);
}
/**--------------------------------------------------------------
* @param pFileName : 文件名
* @param iMode : 文件的建立方式
* @return true : 成功,false : 失败
* @description 建立并打开文件
* open_mode 枚举类型中的每个枚举常量的含义如下:
* O_RDONLY 使文件只用于数据输入,即从中读取数据。
* O_WRONLY 使文件只用于数据输出,即向它写入数据。
* O_RDWR 使文件只用于数据读写,即向它读写数据。
* O_NDELAY UNIX用
* O_APPEND 使文件指针移至文件尾,即最后位置。
* O_TRUNC 若打开的文件存在,则清除其全部内容,使<br>
* 之变为空文件。
* O_CREAT 若打开的文件不存在则不建立它,返回打开<br>
* 失败信息。
* O_EXCL 若打开的文件存在则返回打开失败信息。
* O_BINARY 规定打开的为二进制文件,否则打开的为字<br>
* 符文件。
* O_TEXT 规定打开的为字符文件。
* @sample O_RDWR | O_BINARY 规定打开的文件是二进<br>
* 制文件,并可同时用于输入和输出。
*----------------------------------------------------------------*/
bool DCFile::CreateFile(char *pFileName,int iMode)
{
CloseFile();
m_FileHandle = open(pFileName,iMode,S_IREAD | S_IWRITE);
if (m_FileHandle == -1)
return false;
m_bOpenFlag = true;
strcpy(m_szFileName,pFileName);
m_iOpenMode = iMode;
return true;
}
/**--------------------------------------------------------------
* @param pszFileName : 文件名
* @return true : 成功,false : 失败
* @description 打开文件<br>
* 方式 : O_RDWR | O_BINARY | O_EXCL
*---------------------------------------------------------------*/
bool DCFile::OpenFile(char *pszFileName)
{
return OpenFile(pszFileName,
O_RDWR | O_BINARY | O_EXCL );
}
/**--------------------------------------------------------------
* @param pszFileName : 文件名
* @param iMode : 文件的打开方式
* @return true : 成功,false : 失败
* @description 打开文件
*---------------------------------------------------------------*/
bool DCFile::OpenFile(char *pszFileName,int iMode)
{
CloseFile();
m_FileHandle = open(pszFileName,iMode,S_IREAD | S_IWRITE);
if (m_FileHandle == -1)
return false;
m_bOpenFlag = true;
strcpy(m_szFileName,pszFileName);
m_iOpenMode = iMode;
return true;
}
/**--------------------------------------------------------------
* @param 无
* @return 无
* @description 关闭文件
*---------------------------------------------------------------*/
void DCFile::CloseFile()
{
if (m_bOpenFlag)
{
close(m_FileHandle);
m_bOpenFlag = false;
}
}
/**--------------------------------------------------------------
* @param 无
* @return 当前文件读写指针位置
* @description 取文件读写指针
*---------------------------------------------------------------*/
long DCFile::GetCurrentPos()
{
if (!m_bOpenFlag)
return -1;
return tell(m_FileHandle);
}
/**--------------------------------------------------------------
* @param lOffset : 移动偏移
* @param iMode : 移动方向<br>
* DC_SEEK_SET : 文件开头 <br>
* DC_SEEK_CUR : 文件当前位置 <br>
* DC_SEEK_END : 文件结尾 <br>
* @return 无
* @description 移动文件读写指针
*---------------------------------------------------------------*/
void DCFile::Lseek(long lOffset,int iMode)
{
lseek(m_FileHandle,lOffset,iMode);
}
/**--------------------------------------------------------------
* @param 无
* @return true : 已打开,false : 未打开
* @description 文件是否打开
*---------------------------------------------------------------*/
bool DCFile::IsFileOpen()
{
return m_bOpenFlag;
}
/**--------------------------------------------------------------
* @param 无
* @return true : 存在,false : 不存在
* @description 文件是否存在
*---------------------------------------------------------------*/
bool DCFile::IsFileExist(char *pszFileName)
{
if (access(pszFileName, 0) == 0)
return true;
return false;
}
/**--------------------------------------------------------------
* @param 无
* @return 文件长度
* @description 取文件长度
*---------------------------------------------------------------*/
long DCFile::GetFileLength()
{
if (!IsFileOpen())
return -1;
long iOldPos = tell(m_FileHandle);
lseek(m_FileHandle,0,SEEK_END);
long lFileLength = tell(m_FileHandle);
lseek(m_FileHandle,iOldPos,SEEK_SET);
return lFileLength;
}
/**--------------------------------------------------------------
* @param lInsetOffset : 插入位置的偏移
* @param pBuffer : 缓冲区指针
* @param lBufferLen : 缓冲区长度
* @return true : 成功,false : 失败
* @description 在文件某偏移处插入一块内容,后面内容后移
*---------------------------------------------------------------*/
bool DCFile::InsetFileBlock(long lInsetOffset,void *pBuffer, long lBufferLen)
{
if ((lBufferLen <= 0) || (!m_bOpenFlag))
return false;
long lFileLen = GetFileLength();
if (lInsetOffset > lFileLen)
return false;
AppendFillBlock(0,lBufferLen);
MoveFileBlock(lInsetOffset + lBufferLen, lInsetOffset, lFileLen - lInsetOffset);
Lseek(lInsetOffset,DC_SEEK_SET);
WriteFile(pBuffer,lBufferLen);
return true;
}
/**--------------------------------------------------------------
* @param lDeleteOffset : 删除位置的偏移
* @param lDeleteLen : 删除长度
* @return true : 成功,false : 失败
* @description 在文件某偏移处删除一块,后面内容前移
*---------------------------------------------------------------*/
bool DCFile::DeleteFileBlock(long lDeleteOffset,long lDeleteLen)
{
if (!m_bOpenFlag)
return false;
long lFileLen = GetFileLength();
if ((lFileLen <= lDeleteOffset) || (lDeleteLen <= 0))
return false;
long lOldOff = lDeleteOffset + lDeleteLen;
if (lOldOff >= lFileLen)
{
SetFileLength(lDeleteOffset);
return true;
}
MoveFileBlock(lDeleteOffset,lOldOff,lFileLen - lOldOff);
SetFileLength(lFileLen - lDeleteLen);
return true;
}
/**--------------------------------------------------------------
* @param pBuffer : 缓冲区指针
* @param lBufferLen : 缓冲区长度
* @return true : 成功,false : 失败
* @description 加入一块内容到文件尾
*---------------------------------------------------------------*/
bool DCFile::AppendFileBlock(void *pBuffer, long lBufferLen)
{
if ((!m_bOpenFlag) || (lBufferLen <= 0))
return false;
long lTempLength;
if (m_lMaxTempLength >= lBufferLen)
lTempLength = lBufferLen;
else
lTempLength = m_lMaxTempLength;
SeekToEnd();
char *pTempBuffer = (char *)pBuffer;
long lCounter = lBufferLen;
while (lCounter > 0)
{
if (lCounter > lTempLength)
{
WriteFile(pTempBuffer,lTempLength);
pTempBuffer += lTempLength;
lCounter -= lTempLength;
}
else
{
WriteFile(pTempBuffer, lCounter);
pTempBuffer += lCounter;
lCounter = 0;
}
}
return true;
}
/**--------------------------------------------------------------
* @param lOffsetDst : 块移动的目标位置的偏移
* @param lOffsetSrc : 块移动的源位置的偏移
* @param lMoveLength : 移动的块长度
* @return true : 成功,false : 失败
* @description 移动文件块,简单覆盖,并不会把原内容后挤
*---------------------------------------------------------------*/
bool DCFile::MoveFileBlock(long lOffsetDst,long lOffsetSrc,long lMoveLength)
{
if (!m_bOpenFlag)
return false;
long lFileLen = GetFileLength();
if (((lOffsetDst + lMoveLength) > lFileLen)
||((lOffsetSrc + lMoveLength) > lFileLen))
return false;
if (lOffsetDst == lOffsetSrc)
return true;
long lTempLength;
if (m_lMaxTempLength >= lMoveLength)
lTempLength = lMoveLength;
else
lTempLength = m_lMaxTempLength;
long v_OffsetSrc = lOffsetSrc;
long v_OffsetDst = lOffsetDst;
long lCounter = lMoveLength;
if (lOffsetDst > lOffsetSrc)
{
v_OffsetSrc = lOffsetSrc + lMoveLength - lTempLength;
v_OffsetDst = lOffsetDst + lMoveLength - lTempLength;
}
char *pTempBuffer = new char[lTempLength];
while (lCounter > 0)
{
if (lCounter > lTempLength)
{
Lseek(v_OffsetSrc,DC_SEEK_SET);
ReadFile((void*)pTempBuffer,lTempLength);
Lseek(v_OffsetDst,DC_SEEK_SET);
WriteFile((void*)pTempBuffer,lTempLength);
lCounter -= lTempLength;
}
else
{
Lseek(v_OffsetSrc,DC_SEEK_SET);
ReadFile((void*)pTempBuffer, lCounter);
Lseek(v_OffsetDst,DC_SEEK_SET);
WriteFile((void*)pTempBuffer, lCounter);
lCounter = 0;
}
if (lOffsetDst < lOffsetSrc)
{
v_OffsetSrc += lTempLength;
v_OffsetDst += lTempLength;
}
else
{
if (lCounter > lTempLength)
{
v_OffsetSrc -= lTempLength;
v_OffsetDst -= lTempLength;
}
else
{
v_OffsetSrc -= lCounter;
v_OffsetDst -= lCounter;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -