trochilus/common/FileParser.cpp

234 lines
3.6 KiB
C++

#include "StdAfx.h"
#include "FileParser.h"
CFileParser::CFileParser(void)
{
}
CFileParser::~CFileParser(void)
{
}
BOOL CFileParser::Write( LPCTSTR filepath,int nSize,std::wstring MD5,ByteBuffer& buffer )
{
BOOL ret = FALSE;
FILE_OPTIONS options;
do
{
if (!GetFileCurStatus(filepath,options))
break;
ret = PutFilecContent(filepath,nSize,buffer);
if (ret)
options.nCurSel += nSize;
UpdateFileStatus(filepath,options);
} while (FALSE);
return ret;
}
int CFileParser::Read( LPCTSTR filepath,int nOffset,int nSize,std::wstring& MD5 ,ByteBuffer& buffer )
{
int ret = 0;
ret = GetFileMD5(filepath,&MD5);
if (!ret)
return 0;
ret = GetFileContent(filepath,nOffset,nSize,buffer);
return ret;
}
BOOL CFileParser::IsFileFinish(LPCTSTR filepath)
{
FILE_OPTIONS options;
BOOL ret = GetFileCurStatus(filepath,options);
if (ret)
{
if ( options.nCurSel == options.nTotalSize )
{
DeleteFile((std::wstring(filepath)+OPTIONS_EXT).c_str());
return TRUE;
}
}
return FALSE;
}
int CFileParser::GetFileContent( LPCTSTR filepath,INT64 nPos,int nSize ,ByteBuffer& buffer )
{
MyFile file;
int size;
int ret = 0;;
if (!file.Open(filepath,GENERIC_READ))
return 0;
size = GetFileSize(file,0);
DWORD dwRet = SetFilePointer(file,nPos,0,FILE_BEGIN );
if (dwRet != HFILE_ERROR)
{
DWORD dwRet = file.Read(nSize,buffer);
ret = dwRet;
}
file.Close();
return ret;
}
BOOL CFileParser::PutFilecContent(LPCTSTR filepath,int nSize ,ByteBuffer& buffer)
{
MyFile file;
file.Open(filepath,GENERIC_WRITE,OPEN_ALWAYS);
DWORD dwRet = SetFilePointer(file,0,0,FILE_END );
BOOL ret = FALSE;
do
{
if (dwRet != HFILE_ERROR)
{
ret = file.Write(buffer,nSize);
if (ret)
break;
}
} while (FALSE);
file.Close();
return ret;
}
BOOL CFileParser::IsFileExist(LPCTSTR filepath)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(filepath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
return false;
else
{
FindClose(hFind);
return true;
}
return false;
}
BOOL CFileParser::GetFileCurStatus(LPCTSTR filepath,FILE_OPTIONS& options)
{
BOOL ret = FALSE;
std::wstring strCfg = filepath;
strCfg += OPTIONS_EXT;
ret = IsFileExist(strCfg.c_str());
if (!ret)
{
options.nTotalSize = 0;
options.nCurSel = 0;
return TRUE;
}
MyFile file;
if (!file.Open(strCfg.c_str(),GENERIC_READ))
return ret;
do
{
int nSize = GetFileSize(file,0);
if (nSize != OPTIONS_SIZE)
{
ret = FALSE;
break;
}
ByteBuffer buf;
nSize = file.Read(OPTIONS_SIZE,buf);
if (nSize != OPTIONS_SIZE)
{
ret = FALSE;
break;
}
memcpy(&options,(LPBYTE)buf,OPTIONS_SIZE);
} while (FALSE);
file.Close();
return ret;
}
BOOL CFileParser::CreateFileStatus( LPCTSTR filepath,LPCTSTR md5,int nTotal )
{
BOOL ret = FALSE;
std::wstring strCfg = filepath;
strCfg += OPTIONS_EXT;
MyFile filecgf;
ret = filecgf.Open(strCfg.c_str(),GENERIC_WRITE,CREATE_ALWAYS);
if (!ret)
return ret;
FILE_OPTIONS options;
options.nCurSel = 0;
lstrcpyA(options.szMD5,t2a(md5));
options.nTotalSize = nTotal;
lstrcpyA(options.szFileName,t2a(filepath));
filecgf.Write((LPBYTE)&options,OPTIONS_SIZE);
filecgf.Close();
return TRUE;
}
BOOL CFileParser::UpdateFileStatus(LPCTSTR filepath,FILE_OPTIONS& options)
{
BOOL ret = FALSE;
std::wstring strCfg = filepath;
strCfg += OPTIONS_EXT;
MyFile file;
if (!file.Open(strCfg.c_str(),GENERIC_WRITE))
return ret;
do
{
int nSize = GetFileSize(file,0);
if (nSize != OPTIONS_SIZE)
break;
ByteBuffer buf;
ret = file.Write((LPBYTE)&options,OPTIONS_SIZE);
} while (FALSE);
file.Close();
return ret;
}