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 + -
显示快捷键?