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