dcfile.cpp
来自「通用文件操作类:该类通用文件操作进行了封装」· C++ 代码 · 共 667 行 · 第 1/2 页
CPP
667 行
delete pTempBuffer;
return true;
}
/**--------------------------------------------------------------
* @param lBufferLen : 追加空块的长度
* @return true : 成功,false : 失败
* @description 加入空块到文件尾
*---------------------------------------------------------------*/
bool DCFile::AppendFileBlock(long lBufferLen)
{
if ((!m_bOpenFlag) || (lBufferLen <= 0))
return false;
long lTempLength;
if (m_lMaxTempLength >= lBufferLen)
lTempLength = lBufferLen;
else
lTempLength = m_lMaxTempLength;
long lCounter = lBufferLen;
char *pTempBuffer = new char[lTempLength];
memset(pTempBuffer,0,lTempLength);
SeekToEnd();
while (lCounter > 0)
{
if (lCounter > lTempLength)
{
WriteFile((void*)pTempBuffer, lTempLength);
lCounter -= lTempLength;
}
else
{
WriteFile((void*)pTempBuffer, lCounter);
lCounter = 0;
}
}
delete pTempBuffer;
return true;
}
/**--------------------------------------------------------------
* @param lOffset : 覆盖位置的偏移
* @param pBuffer : 缓冲区指针
* @param lBufferLen : 缓冲区长度
* @return true : 成功,false : 失败
* @description 在文件某偏移处覆盖一块
*---------------------------------------------------------------*/
bool DCFile::CoverFileBlock(long lOffset,void *pBuffer, long lBufferLen)
{
if ((!m_bOpenFlag)||(!pBuffer))
return false;
long lFileLen = GetFileLength();
if ((lFileLen < (lOffset + lBufferLen)) || (lBufferLen <= 0))
return false;
Lseek(lOffset,DC_SEEK_SET);
WriteFile(pBuffer,lBufferLen);
return true;
}
/**--------------------------------------------------------------
* @param cCode : 填充码
* @param lOffset : 填充位置的偏移
* @param lLength : 填充长度
* @return true : 成功,false : 失败
* @description 填充文件的一块
*---------------------------------------------------------------*/
bool DCFile::FileFillBlock(char cCode,long lOffset,long lLength)
{
if (!m_bOpenFlag)
return false;
long lFileLen = GetFileLength();
if ((lFileLen < (lOffset + lLength)) || (lLength <= 0))
return false;
long lTempLength;
if (m_lMaxTempLength >= lLength)
lTempLength = lLength;
else
lTempLength = m_lMaxTempLength;
long lCounter = lLength;
char *pTempBuffer = new char[lTempLength];
memset(pTempBuffer,cCode,lTempLength);
Lseek(lOffset,DC_SEEK_SET);
while (lCounter > 0)
{
if (lCounter > lTempLength)
{
WriteFile((void*)pTempBuffer,lTempLength);
lCounter -= lTempLength;
}
else
{
WriteFile((void*)pTempBuffer,lCounter);
lCounter = 0;
}
}
delete pTempBuffer;
return true;
}
/**--------------------------------------------------------------
* @param cCode : 填充码
* @param lLength : 填充长度
* @return true : 成功,false : 失败
* @description 加入空块到文件尾并填充
*---------------------------------------------------------------*/
bool DCFile::AppendFillBlock(char cCode, long lLength)
{
if ((!m_bOpenFlag) || (lLength <= 0))
return false;
long lTempLength;
if (m_lMaxTempLength >= lLength)
lTempLength = lLength;
else
lTempLength = m_lMaxTempLength;
long lCounter = lLength;
char *pTempBuffer = new char[lTempLength];
memset(pTempBuffer,cCode,lTempLength);
SeekToEnd();
while (lCounter > 0)
{
if (lCounter > lTempLength)
{
WriteFile((void*)pTempBuffer, lTempLength);
lCounter -= lTempLength;
}
else
{
WriteFile((void*)pTempBuffer, lCounter);
lCounter = 0;
}
}
delete pTempBuffer;
return true;
}
/**--------------------------------------------------------------
* @param lOffset : 截断文件的位置
* @return true : 成功,false : 失败
* @description 截断文件
*---------------------------------------------------------------*/
bool DCFile::TruncatFile(long lOffset)
{
SetFileLength(lOffset);
return true;
}
/**--------------------------------------------------------------
* @param lReadOffset : 读出位置的偏移
* @param pBuffer : 接收缓冲区的指针
* @param lBufferLen : 接收缓冲区的长度
* @return 实际读出文件的长度,异常 = -1
* @description 从文件读出一块
*---------------------------------------------------------------*/
long DCFile::ReadFile(long lReadOffset,void *pBuffer, long lBufferLen)
{
if (!m_bOpenFlag)
return -1;
Lseek(lReadOffset,DC_SEEK_SET);
return read(m_FileHandle,pBuffer,lBufferLen);
}
/**--------------------------------------------------------------
* @param lWriteOffset : 写入位置的偏移
* @param pBuffer : 写入缓冲区的指针
* @param lBufferLen : 写入缓冲区的长度
* @return 实际写入文件的长度,异常 = -1
* @description 写一块到文件内
*---------------------------------------------------------------*/
long DCFile::WriteFile(long lWriteOffset,void *pBuffer, long lBufferLen)
{
if (!m_bOpenFlag)
return -1;
Lseek(lWriteOffset,DC_SEEK_SET);
return write(m_FileHandle,pBuffer,lBufferLen);
}
/**--------------------------------------------------------------
* @param pBuffer : 接收缓冲区的指针
* @param lBufferLen : 接收缓冲区的长度
* @return 实际读出文件的长度
* @description 从文件当前位置读出一块
*---------------------------------------------------------------*/
long DCFile::ReadFile(void *pBuffer, long lBufferLen)
{
if (!m_bOpenFlag)
return -1;
return read(m_FileHandle,pBuffer,lBufferLen);
}
/**--------------------------------------------------------------
* @param pBuffer : 写入缓冲区的指针
* @param lBufferLen : 写入缓冲区的长度
* @return 实际写入文件的长度
* @description 从文件当前位置写入一块
*---------------------------------------------------------------*/
long DCFile::WriteFile(void *pBuffer, long lBufferLen)
{
if (!m_bOpenFlag)
return -1;
return write(m_FileHandle,pBuffer,lBufferLen);
}
/**--------------------------------------------------------------
* @param 无
* @return 无
* @description 文件指针移动到文件尾
*---------------------------------------------------------------*/
void DCFile::SeekToEnd()
{
if (m_bOpenFlag)
Lseek(0,DC_SEEK_END);
}
/**--------------------------------------------------------------
* @param pFileName : 文件名
* @return true : 成功,false : 失败
* @description 删除文件
*---------------------------------------------------------------*/
bool DCFile::DeleteFile(char *pFileName)
{
#ifdef __WINDOWS_OS
return DeleteFile(pFileName);
#else
return !remove(pFileName);
#endif
}
/**--------------------------------------------------------------
* @param pszFileOld : 原文件名
* @param pszFileNew : 新文件名
* @return true : 成功,false : 失败
* @description 文件改名
*---------------------------------------------------------------*/
bool DCFile::RenameFile(char *pszFileOld,char *pszFileNew)
{
#ifdef __WINDOWS_OS
return RenameFile(pszFileOld, pszFileNew);
#else
return !rename(pszFileOld, pszFileNew);
#endif
}
/**--------------------------------------------------------------
* @param pszFileDst : 拷贝目标文件名
* @param pszFileSrc : 拷贝源文件名
* @return true : 成功,false : 失败
* @description 拷贝文件
*---------------------------------------------------------------*/
bool DCFile::CopyFile(char *pszFileDst,char *pszFileSrc)
{
if (IsFileExist(pszFileSrc))
return false;
bool bRet = false;
#ifdef __WINDOWS_OS
int hFileSrc = open(pszFileSrc, O_BINARY | O_RDONLY);
int hFileDst = open(pszFileDst, O_CREAT | O_BINARY | O_RDWR);
if ((hFileSrc != -1) && (hFileDst != -1))
{
char *pTempBuffer = new char[MAXTEMPLATEBUFFLEN];
long lFileLength = filelength(hFileSrc);
long lReadLength;
while (lFileLength > 0)
{
if (lFileLength > MAXTEMPLATEBUFFLEN)
lReadLength = MAXTEMPLATEBUFFLEN;
else
lReadLength = lFileLength;
read(hFileSrc,pTempBuffer,lReadLength);
write(hFileDst,pTempBuffer,lReadLength);
lFileLength -= lReadLength;
}
delete [] pTempBuffer;
bRet = true;
}
close(hFileDst);
close(hFileSrc);
#else
ifstream infile(pszFileSrc,ifstream::binary);
ofstream outfile(pszFileDst,ofstream::binary);
if ((infile.is_open()) && (outfile.is_open()))
{
infile.seekg(0,ifstream::end);
long lFileLength = infile.tellg();
infile.seekg(0);
char *pTempBuffer = new char[MAXTEMPLATEBUFFLEN];
long lReadLength;
while (lFileLength > 0)
{
if (lFileLength > MAXTEMPLATEBUFFLEN)
lReadLength = MAXTEMPLATEBUFFLEN;
else
lReadLength = lFileLength;
infile.read(pTempBuffer,lReadLength);
outfile.write(pTempBuffer,lReadLength);
lFileLength -= lReadLength;
}
delete [] pTempBuffer;
bRet = true;
}
outfile.close();
infile.close();
#endif
return bRet;
}
/**--------------------------------------------------------------
* @param lFileLen : 文件长度
* @return true : 成功,false : 失败
* @description 设文件长度
*---------------------------------------------------------------*/
bool DCFile::SetFileLength(long lFileLen)
{
if (!m_bOpenFlag)
return false;
bool bRet = false;
#ifdef __WINDOWS_OS
int iCurrPos = tell(m_FileHandle);
if (chsize(m_FileHandle,lFileLen) == 0)
bRet = true;
lseek(m_FileHandle,iCurrPos,SEEK_SET);
#else
int iCurrPos = tell(m_FileHandle);
if (ftruncate(m_FileHandle,lFileLen) == 0)
bRet = true;
lseek(m_FileHandle,iCurrPos,SEEK_SET);
#endif
return bRet;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?