zoukankan      html  css  js  c++  java
  • 使用CInternetSession CHttpFile下载网页链接地址的文件

    思路很清晰,使用CInternetSession创建CHttpFile对象。然后对该对象获取文件信息、进行文件读写操作均可。

    void DownloadFile(LPCTSTR szURL, LPCTSTR szFile) //szURL 表示网页地址 szFile 表示保存本地的路径(及要保存的文件名) 感谢网友oceansoft http://blog.chinaunix.net/uid-7718934-id-2564609.html分享
    {
        DWORD dwFlag =                  //设置读取的方式
            INTERNET_FLAG_TRANSFER_BINARY |
            INTERNET_FLAG_DONT_CACHE |
            INTERNET_FLAG_RELOAD;
    
        CInternetSession cis;
        CHttpFile* pFile = (CHttpFile*)cis.OpenURL(szURL, 1, dwFlag); //创建CHttpFile对象
    if(pFile) { DWORD dwStatusCode; pFile->QueryInfoStatusCode(dwStatusCode); //获得HTTP响应请求的状态 CString dwFileLength;//这段代码是自己测试使用,获取请求文件的大小,单位是kb
         pFile
    ->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,dwFileLength); int length = atoi(dwFileLength)/1024; if(dwStatusCode == 200) //200 表示 网页地址正常响应 { CString str; CFile cf; //创建CFile对象 if(!cf.Open(szFile, CFile::modeWrite|CFile::modeCreate)) //该目录是否有权限打开,如果打开失败就直接返回 return; char lpBuf[4096];//每次读取文件的大小 为4kb UINT dwRead = 0, dwFileLen = 0; do { dwRead = pFile->Read(lpBuf, sizeof(lpBuf)); //每次读取 4096 B = 1024 * 4 B = 4kb的内容 dwRead 为实际读写的大小 if(dwRead > 0) { cf.Write(lpBuf, dwRead); //写入文件 dwFileLen += dwRead; //dwFileLen表示实际下载的大小 } }while(dwRead > 0); cf.Close(); //关闭打开的资源 } pFile->Close(); delete pFile; } }
    OpenURL函数原型如下:
    CStdioFile* OpenURL(
       LPCTSTR pstrURL, //下载的地址
       DWORD_PTR dwContext = 1, //An application-defined value passed with the returned handle in callback. (具体是啥,还不用过,翻译就是在回调时返回的自定义值,英语各种水,就用它默认的值1)
       DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, //设置传输的方式有很多 具体见 http://msdn.microsoft.com/zh-cn/library/d25ew7sy(v=VS.80).aspx
       LPCTSTR pstrHeaders = NULL,
       DWORD dwHeadersLength = 0 
    );
    返回值有很多类型使用强制转换就可以了,我们使用的是CHttpFile
    URL typeReturns

    file://

    CStdioFile*

    http://

    CHttpFile*

    gopher://

    CGopherFile*

    ftp://

    CInternetFile*

    测试的函数调用为DownloadFile("http://dldir1.qq.com/qqfile/qq/QQ2013/QQ2013SP6/9305/QQ2013SP6.exe", "E:\\程序\\C++测试\\tttt\\tttt\\QQ2013SP6.exe");

  • 相关阅读:
    Redis系列一
    浅谈Java开发三层架构
    plsql乱码问题
    eclipse工作空间的常用设置
    《经典面试系列》- 索引
    《数据库优化》- 存储过程
    遍历Map的四种方式(Java)
    调用微信js sdk
    根据多个成对的cron表达式生成的时间段,合并
    关于Map集合注意事项
  • 原文地址:https://www.cnblogs.com/ShalenChe/p/3617194.html
Copyright © 2011-2022 走看看