CopyFile(CopyFileEx)复制.mov大文件时关闭文件后文件没有复制完全

原本以为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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值