⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcfile.cpp

📁 通用文件操作类:该类通用文件操作进行了封装
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#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 + -