原本以为CFile.close可以直接把缓冲区的数据写到磁盘文件里,但当遇到大的mov文件时,文件老是为无效文件,最后通过调试才发现,close并没有把缓冲区的内容写到磁盘文件里,特别是当文件比较大的时候,所以在文件写完后要进行,CFile.flush();
CFile sourceFile, destFile;
CFileFind FileFind;
CFileException ex;
BOOL bGetCfgAuthority = FALSE;
// 如果文件名太长, 使用短文件名
LPCTSTR lpSrcFile = szDesDir;
LPCTSTR lpDestFile = lpVDSrcPath;
TCHAR f_szSrcFile[MAX_PATH * 2] = {'\0'};
TCHAR f_szDesFile[MAX_PATH * 2] = {'\0'};
if(_tcslen( lpSrcFile ) > 255)
{
//文件名过长直接返回
return DRM_ERR_FILE_NAME_LONG;
}
if (_tcslen( lpSrcFile ) > 200)
{
GetShortPathName( lpSrcFile, f_szSrcFile, _countof(f_szSrcFile) );
lpSrcFile = f_szSrcFile;
}
if (_tcslen( lpDestFile ) > 200)
{
GetShortPathName( lpDestFile, f_szDesFile, _countof(f_szDesFile) );
lpDestFile = f_szDesFile;
}
if (!sourceFile.Open( lpSrcFile, CFile::modeRead | CFile::shareDenyNone, &ex ))
{
//TCHAR szError[1024];
//ex.GetErrorMessage(szError, 1024);
//_tprintf_s(_T("Couldn't open source file: %1024s"), szError);
//XMessageBox( NULL, szError, GetGenWndTitle(), MB_OK | MB_ICONEXCLAMATION ); //文件打开失败
return DRM_ERR_SOURFILE_OPEN;
}
if (!destFile.Open( lpDestFile, CFile::modeWrite | CFile::shareDenyWrite | CFile::modeCreate, &ex ))
{
sourceFile.Close();
return DRM_ERR_DESTFILE_OPEN;;
}
BYTE inputbuffer[FILE_PACK_LENGTH+1]; // 原文缓冲数据
BYTE outputbuffer[FILE_PACK_LENGTH + 17]; // 目的文件缓冲数据
DWORD dwRead; // 单次读取数据长度
ULONGLONG dwFileLength; // 文件长度
ULONGLONG iPack; // 包数
unsigned int iLastPack; // 最后一包数据长度
dwFileLength = sourceFile.GetLength();
iPack = dwFileLength / FILE_PACK_LENGTH;
iLastPack = dwFileLength % FILE_PACK_LENGTH;
// 计算循环的次数, 最后一次调用补位的方式
if (0 != iLastPack)
{
iPack += 1;
}
//进度条总长度为50,所以每进一格需要的包数为EveryPosPack
UINT EveryPosPack = iPack / 50;
UINT pos = 0;
for (ULONGLONG iloop = 0; iloop < iPack; iloop++)
{
if(EveryPosPack == 0)
pos = (50/iPack) * iloop + 2;
else
pos = iloop/EveryPosPack+2;
if(pos > 50)
pos = 50;
m_ctlProgress.SetPos(index*50+pos);
dwRead = sourceFile.Read( inputbuffer, FILE_PACK_LENGTH );
if ((dwRead < FILE_PACK_LENGTH) && (iloop != iPack - 1))
{
destFile.Close();
sourceFile.Close();
//DeleteFile( szDestFile );
return DRM_ERR_SOURFILE_OPEN;
}
try
{
destFile.Write( inputbuffer, dwRead );
//destFile.Flush();
}
catch (...)
{
// 磁盘空间不足等等异常
destFile.Close();
sourceFile.Close();
return DRM_ERR_ENCRYPTFILE;
}
}
destFile.Flush();
destFile.Close();
sourceFile.Close();