234 lines
3.6 KiB
C++
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;
|
|
} |