CDataFile

/******************************************************************************
* File Name : DataFile.h              *
* Description :   The CDataFile class is used to create and modify       * 
*      data files such as *.ini and *.cfg.        *
* Creator   :   Laughsky(LiQintao)            *
* Create time : 2001/9/25              *
* Bug Report : laugh_sky@hotmail.com || muzilee@263.net       *
******************************************************************************/
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_)
#define AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

///////////////////////////////////////////////////////////////
#define FILE_MAX_LENGTH    1024*50
#define CREATE_MODE_REBUILD   CFile::modeCreate
#define CREATE_MODE_NOREBUILD CFile::modeNoTruncate | CFile::modeCreate

#define OPEN_MODE_READ    CFile::modeRead
#define OPEN_MODE_WRITE    CFile::modeReadWrite
#define OPEN_MODE_READWRITE   CFile::modeReadWrite

#define WRITE_MODE_INSERT   2000
#define WRITE_MODE_OVERWRITE 2001
#define WRITE_MODE_DELETE   2002

#define FLAG_FILE_EXIST   3000
#define FLAG_FILE_NOEXIST 3001

class CDataFile 
{
public:
void DeleteFile(LPCTSTR lpszFileName);
void WriteLine(CString& wString, UINT nFlag);
BOOL MoveToLine(UINT line);

UINT GetLines();
void CloseFile();
BOOL OpenFile(LPCTSTR lpszFileName, UINT nFlags);
INT CheckFileExsist(LPCTSTR lpszFileName);
BOOL ReadLine(CString& rString);
BOOL CreateFile(LPCTSTR lpszFileName, UINT nFlags);
CDataFile();
virtual ~CDataFile();

private:
void MoveEnd();
void MoveStart();
CString FileName; // Save the specified file name
UINT moveLine;   // Save the number of line at current pointer position
BOOL IsFileOpen; // If file has been opened,it is TRUE
CStdioFile file;
};

#endif // !defined(AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_)

=========================================================================

/******************************************************************************
* File Name : DataFile.CPP            *
* Description :   The CDataFile class is used to create and modify    * 
*      data files such as *.ini and *.cfg.        *
* Creator   :   Laughsky(LiQintao)            *
* Create Time : 2001/9/25              *
* Bug Report : laugh_sky@hotmail.com || muzilee@263.net       *
******************************************************************************/
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DataFile.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDataFile::CDataFile()
{
IsFileOpen = FALSE;
moveLine = 1;
}

CDataFile::~CDataFile()
{

}

//Create specified file:
//The nFlags may be 1. CREATE_MODE_REBUILD
//                   2. CREATE_MODE_NOREBUILD
BOOL CDataFile::CreateFile(LPCTSTR lpszFileName, UINT nFlags)
{
if (!OpenFile(lpszFileName, nFlags))
   return FALSE;
CloseFile();
return TRUE;
}

//Read the specified line
BOOL CDataFile::ReadLine(CString &rString)
{
if (!IsFileOpen)
   return FALSE;
if (!file.ReadString(rString))
   return FALSE;
return TRUE;
}

// Check if the specified file exsists
INT CDataFile::CheckFileExsist(LPCTSTR lpszFileName)
{
if (!OpenFile(lpszFileName, OPEN_MODE_READ))
{
   return FLAG_FILE_NOEXIST;
}
CloseFile();
return FLAG_FILE_EXIST;
}

// Open the specified file
BOOL CDataFile::OpenFile(LPCTSTR lpszFileName, UINT nFlags)
{
if (!file.Open(lpszFileName, nFlags))
   return FALSE;
IsFileOpen = TRUE;
FileName = lpszFileName;
return TRUE;
}

// Close the current file
void CDataFile::CloseFile()
{
file.Close();
IsFileOpen = FALSE;
}


UINT CDataFile::GetLines()
{
if (!IsFileOpen)
   return NULL;
unsigned int lines = 0;
CString temp;
MoveStart();

// 如果最后一行为空,则不计其行数
while(file.ReadString(temp))
   lines ++;
return lines;
}

// Move to the start of the file
void CDataFile::MoveStart()
{
if (IsFileOpen)
   file.SeekToBegin();
return;
}

// Move the end of the file
void CDataFile::MoveEnd()
{
if (IsFileOpen)
   file.SeekToEnd();
return;
}

// Move the pointer to the specified line, then you can
// read、overwrite and delete the line by using ReadLine() or WriteLine().
BOOL CDataFile::MoveToLine(UINT line)
{
if (!IsFileOpen)
   return FALSE;
if (line <= 0)
{
   moveLine = 1;
   MoveStart();
   return TRUE;
}
if (line > GetLines())
{
   moveLine = GetLines()+1;
   MoveEnd();
   return TRUE;
}

CString temp;
MoveStart();
for (unsigned int curLine = 1; curLine < line; curLine++)
   file.ReadString(temp);
DWORD pos = file.GetPosition();
file.Seek(pos, CFile::begin);
moveLine = line;
return TRUE;
}

// Write the content you specified at current line.
// The nFlag maybe 1. WRITE_MODE_INSERT
//      2. WRITE_MODE_OVERWRITE
//      3. WRITE_MODE_DELETE
void CDataFile::WriteLine(CString &wString, UINT nFlag)
{
UINT setLine = moveLine;
UINT fileLen = file.GetLength();
if (!IsFileOpen)
   return ;

CString temp;
CString sTest;
sTest.Empty();

MoveToLine(setLine);
UINT upLen = file.GetPosition();
int restLen = fileLen - upLen;
if (restLen > FILE_MAX_LENGTH)
   return;

CString sRestFile,sLine;
char pbuf[FILE_MAX_LENGTH];
memset(pbuf, 0, FILE_MAX_LENGTH);

switch(nFlag)
{
case WRITE_MODE_INSERT:
   if (setLine <= GetLines() || GetLines() == 0)
   {
    MoveToLine(setLine);
    file.Read(pbuf, restLen);
    temp = wString+"n"+pbuf;
    MoveToLine(setLine);
    file.WriteString(temp);
   }
   else{
    CString temp2;
    MoveToLine(GetLines());
    file.ReadString(temp2);
    temp = temp2+"n"+wString;
    MoveToLine(GetLines());
    file.WriteString(temp);
   }
   break;
case WRITE_MODE_OVERWRITE:
   if (setLine < GetLines())
   {
    MoveToLine(setLine);
    ReadLine(sTest);
    MoveToLine(setLine+1);
   }
   else
   {
    setLine = GetLines();
    MoveToLine(GetLines());
    ReadLine(sTest);
    upLen = file.GetPosition(); // 如果指定覆盖的行数大于总行数,则覆盖最后一行
    MoveEnd();
   }
   file.Read(pbuf, restLen);
   if (setLine == GetLines())
    temp = wString;
   else
    temp = wString+"n"+pbuf;

   // 可能是因为CString计算长度时没有把"n"算进去,所以我们要在后面补上它的长度
   fileLen = fileLen + wString.GetLength() - sTest.GetLength();
   if (setLine < GetLines())
    MoveToLine(setLine);
   else
    MoveToLine(GetLines());
   file.WriteString(temp);
   file.SetLength(fileLen);
   break;
case WRITE_MODE_DELETE:
   if (fileLen == 0)
    break;
   if (setLine < GetLines())
   {
    MoveToLine(setLine);
    ReadLine(sTest);
    MoveToLine(setLine+1);
   }
   else
   {
    setLine = GetLines();
    MoveToLine(setLine);
    upLen = file.GetPosition();
    ReadLine(sTest);
    MoveEnd();
   }
   file.Read(pbuf, restLen);
   temp = pbuf;

   // 可能是因为CString计算长度时没有把"n"算进去,所以我们要在后面补上它的长度
   if (setLine < GetLines())
    fileLen = fileLen - sTest.GetLength() -2;
   else
    if (GetLines() == 1)
     fileLen = 0;
    else
     fileLen = upLen-2;// 删除上一行的\0x0D\0x0A
   MoveToLine(setLine);

   file.WriteString(temp);
   file.SetLength(fileLen);
   break;
}
}

// Delete the specified file.
void CDataFile::DeleteFile(LPCTSTR lpszFileName)
{
file.Remove(lpszFileName);
}

 

posted @ 2016-02-25 16:22  風行  阅读(211)  评论(0编辑  收藏  举报