⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 C++Builder高级应用开发指南随书源码
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::FileDownLoad(AnsiString URL, AnsiString LocalFile)
{
  int i;
  AnsiString HostName,FileName;
  //分解URL
  i=URL.Pos("http://");
  if(i>0) URL.Delete(1,7);
  i=URL.Pos("/");
  HostName=URL.SubString(1,i-1);
  FileName=URL.SubString(i,URL.Length());
  //建立会话
  HINTERNET hSession=InternetOpen("Download_Demo",
                                  INTERNET_OPEN_TYPE_PRECONFIG,
                                  NULL,NULL,0);
  //建立连接
  HINTERNET hConnect=InternetConnect(hSession,
                                     HostName.c_str(),
                                     INTERNET_DEFAULT_HTTP_PORT,
                                     NULL,NULL,
                                     INTERNET_SERVICE_HTTP,0,0);
  //初始化下载请求
  const char *Type="*/*";
  HINTERNET hRequest=HttpOpenRequest(hConnect,
                                     "GET",
                                     FileName.c_str(),
                                     "HTTP/1.1",
                                     NULL,
                                     &Type,
                                     INTERNET_FLAG_RESYNCHRONIZE,0);

  //发出下载请求
  HttpSendRequest(hRequest,
                  NULL,
                  0,
                  NULL,
                  0);
  //获取要下载的文件的大小
  DWORD BufferLen;
  DWORD Index=0;
  char Buffer[1025];
  HttpQueryInfo(hRequest,
                HTTP_QUERY_CONTENT_LENGTH,
                Buffer,
                &BufferLen,
                &Index);
  DWORD FileSize=StrToInt(Buffer);
  //建立文件
  int hFile;
  DWORD Count=0;//总共下载的字节数
  if(FileExists(LocalFile))
  {
     hFile=FileOpen(LocalFile,fmOpenWrite);
     Count=GetFileSize(HANDLE(hFile),NULL);
     if(Count>0)
     {
       //调整本地文件指针到末尾
       FileSeek(hFile,0,2);
       //调整Web上的文件指针
       InternetSetFilePointer(hRequest,
                              Count,
                              NULL,
                              FILE_BEGIN,
                              NULL);
     }
  }
  else
  {
    hFile=FileCreate(LocalFile);
  }
  //下载文件
  DWORD Request=1024;//请求下载的字节数目
  DWORD Read;//本次下载的字节数目
  bool Result;
  bool ReadResult;
  do
  {
     Application->ProcessMessages();
     ReadResult=InternetReadFile(hRequest,
                                 (LPVOID)Buffer,
                                 Request,
                                 &Read);
     if(!ReadResult) break;
     if(Read==0) break;
     //保存
     Buffer[Read]='/0';
     FileWrite(hFile,Buffer,Read);
     Count=Count+Read;
     ProgressBar1->Position=Count*100/FileSize;//调整进度条位置
  }
  while(!StopFlag);//检查是否应该停止下载
  FileClose(hFile);

  //释放资源
  InternetCloseHandle(hRequest);
  InternetCloseHandle(hConnect);
  InternetCloseHandle(hSession);
  //提示
  if(FileSize==Count)
  {
     Application->MessageBoxA("下载完毕","",MB_OK);
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  StopFlag=false;
  ProgressBar1->Position=0;
  FileDownLoad(Edit1->Text, Edit2->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   StopFlag=true;     
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -