Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2089462
  • 博文数量: 519
  • 博客积分: 10070
  • 博客等级: 上将
  • 技术积分: 3985
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-29 14:05
个人简介

只问耕耘

文章分类

全部博文(519)

文章存档

2016年(1)

2013年(5)

2011年(46)

2010年(220)

2009年(51)

2008年(39)

2007年(141)

2006年(16)

我的朋友

分类: C/C++

2006-05-29 14:29:20

原理:
1. 打开本地文件fopen,移动文件指针到文件尾fseek
2. 获得文件大小ftell, 格式化HTTP请求头 "Range: bytes=ftell -", 以偏移httpfile指针,实现断点续传
3. 获得要下载的文件,以二进制形式传输,OpenURL
4. 接收数据,防止阻塞PeekMessage

Sample:
char string[25];
 CString StrFileName=m_lf;
 CString StrUrl=m_url;
 CString sheader;
 long lStartPos =0;
 
 //打开本地文件,m_lf 是文件路径,如:C:\\a.mp3
 FILE *file=NULL;
 file=fopen(m_lf,"ab");
 if(file!=NULL)
 {
 //移动文件指针到文件尾
  fseek(file,0,SEEK_END);
  lStartPos=ftell(file);
  itoa(lStartPos,string,10);
  m_byte=string;
 //格式化请求头,如: 从第 1000 个字节起开始下载:“Range: bytes=999 -”

  sheader.Format(_T("%sRange: bytes=%d-\r\n"), szHeaders,lStartPos);
 }
 else
 {
  MessageBox("local file failed!");
  return;
 }
 try{
 CInternetSession s;
 CHttpFile *hf=NULL;
 //获得要下载的文件,以二进制形式传输
 hf=(CHttpFile*)s.OpenURL(m_url,1,INTERNET_FLAG_TRANSFER_BINARY,sheader,-1 );
 if(hf!=NULL)
 {
 //开始传输数据
  byte *nbytes = new byte[512];
  int nReadSize=0;
  nReadSize=hf->Read(nbytes,512);
  while( nReadSize >0)
  {
   fwrite(nbytes,1,nReadSize,file);

   nReadSize=hf->Read(nbytes,512);
   lStartPos=ftell(file);
   itoa(lStartPos,string,10);
   m_byte=string;
//防止阻塞
   doenents();
  }
 
  fclose(file);
  hf->Close();
  delete hf;

 }

 }catch(CInternetException *p){
//  hf=NULL;
  p->Delete();
 }

BOOL CGfDlg::doenents()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
}

阅读(1695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~