?? dcfile.cpp
字號(hào):
#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 建立并打開(kāi)文件<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 建立并打開(kāi)文件<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 建立并打開(kāi)文件
* open_mode 枚舉類(lèi)型中的每個(gè)枚舉常量的含義如下:
* O_RDONLY 使文件只用于數(shù)據(jù)輸入,即從中讀取數(shù)據(jù)。
* O_WRONLY 使文件只用于數(shù)據(jù)輸出,即向它寫(xiě)入數(shù)據(jù)。
* O_RDWR 使文件只用于數(shù)據(jù)讀寫(xiě),即向它讀寫(xiě)數(shù)據(jù)。
* O_NDELAY UNIX用
* O_APPEND 使文件指針移至文件尾,即最后位置。
* O_TRUNC 若打開(kāi)的文件存在,則清除其全部?jī)?nèi)容,使<br>
* 之變?yōu)榭瘴募?* O_CREAT 若打開(kāi)的文件不存在則不建立它,返回打開(kāi)<br>
* 失敗信息。
* O_EXCL 若打開(kāi)的文件存在則返回打開(kāi)失敗信息。
* O_BINARY 規(guī)定打開(kāi)的為二進(jìn)制文件,否則打開(kāi)的為字<br>
* 符文件。
* O_TEXT 規(guī)定打開(kāi)的為字符文件。
* @sample O_RDWR | O_BINARY 規(guī)定打開(kāi)的文件是二進(jìn)<br>
* 制文件,并可同時(shí)用于輸入和輸出。
*----------------------------------------------------------------*/
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 打開(kāi)文件<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 : 文件的打開(kāi)方式
* @return true : 成功,false : 失敗
* @description 打開(kāi)文件
*---------------------------------------------------------------*/
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 無(wú)
* @return 無(wú)
* @description 關(guān)閉文件
*---------------------------------------------------------------*/
void DCFile::CloseFile()
{
if (m_bOpenFlag)
{
close(m_FileHandle);
m_bOpenFlag = false;
}
}
/**--------------------------------------------------------------
* @param 無(wú)
* @return 當(dāng)前文件讀寫(xiě)指針位置
* @description 取文件讀寫(xiě)指針
*---------------------------------------------------------------*/
long DCFile::GetCurrentPos()
{
if (!m_bOpenFlag)
return -1;
return tell(m_FileHandle);
}
/**--------------------------------------------------------------
* @param lOffset : 移動(dòng)偏移
* @param iMode : 移動(dòng)方向<br>
* DC_SEEK_SET : 文件開(kāi)頭 <br>
* DC_SEEK_CUR : 文件當(dāng)前位置 <br>
* DC_SEEK_END : 文件結(jié)尾 <br>
* @return 無(wú)
* @description 移動(dòng)文件讀寫(xiě)指針
*---------------------------------------------------------------*/
void DCFile::Lseek(long lOffset,int iMode)
{
lseek(m_FileHandle,lOffset,iMode);
}
/**--------------------------------------------------------------
* @param 無(wú)
* @return true : 已打開(kāi),false : 未打開(kāi)
* @description 文件是否打開(kāi)
*---------------------------------------------------------------*/
bool DCFile::IsFileOpen()
{
return m_bOpenFlag;
}
/**--------------------------------------------------------------
* @param 無(wú)
* @return true : 存在,false : 不存在
* @description 文件是否存在
*---------------------------------------------------------------*/
bool DCFile::IsFileExist(char *pszFileName)
{
if (access(pszFileName, 0) == 0)
return true;
return false;
}
/**--------------------------------------------------------------
* @param 無(wú)
* @return 文件長(zhǎng)度
* @description 取文件長(zhǎng)度
*---------------------------------------------------------------*/
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 : 緩沖區(qū)指針
* @param lBufferLen : 緩沖區(qū)長(zhǎng)度
* @return true : 成功,false : 失敗
* @description 在文件某偏移處插入一塊內(nèi)容,后面內(nèi)容后移
*---------------------------------------------------------------*/
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 : 刪除長(zhǎng)度
* @return true : 成功,false : 失敗
* @description 在文件某偏移處刪除一塊,后面內(nèi)容前移
*---------------------------------------------------------------*/
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 : 緩沖區(qū)指針
* @param lBufferLen : 緩沖區(qū)長(zhǎng)度
* @return true : 成功,false : 失敗
* @description 加入一塊內(nèi)容到文件尾
*---------------------------------------------------------------*/
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 : 塊移動(dòng)的目標(biāo)位置的偏移
* @param lOffsetSrc : 塊移動(dòng)的源位置的偏移
* @param lMoveLength : 移動(dòng)的塊長(zhǎng)度
* @return true : 成功,false : 失敗
* @description 移動(dòng)文件塊,簡(jiǎn)單覆蓋,并不會(huì)把原內(nèi)容后擠
*---------------------------------------------------------------*/
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;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -