网络下载文件小程序(非原创,他人所写)
来源:互联网 发布:机顶盒u盘装软件 编辑:程序博客网 时间:2024/05/21 10:17
#include <Windows.h>#include <iostream>#include <string>#include <vector>#include <algorithm>#include <wininet.h>#include <shellApi.h>#include <Shlwapi.h>#include <ShlObj.h>#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)#pragma comment(lib, "shlwapi.lib")#pragma comment(lib,"wininet") using namespace std; bool DownloadFile(LPCTSTR szUrl,LPCTSTR szLocalFile,BOOL bFailIfExists); int main(int argc, char* argv[]){ std::cout<<DownloadFile("http://www.baidu.com/","d:\\1.htm",TRUE)<<std::endl; getchar(); return 0;} bool DownloadFile(LPCTSTR szUrl,LPCTSTR szLocalFile,BOOL bFailIfExists){ if (bFailIfExists && !PathIsDirectory(szLocalFile) && (GetFileAttributes(szLocalFile) != INVALID_FILE_ATTRIBUTES)) { return false; } HANDLE hFile = INVALID_HANDLE_VALUE; HINTERNET hInet = NULL; HINTERNET hUrl = NULL; DWORD dwBuf = 1024*1024,dwRead = 0; //1M auto_ptr<char> szBuf(new char[dwBuf]); memset(szBuf.get(),0,dwBuf); std::string strTmp; bool bRet = false; try { hFile = CreateFile(szLocalFile,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile == INVALID_HANDLE_VALUE) throw "error"; hInet = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); if (hInet == NULL) throw "error"; hUrl = InternetOpenUrl(hInet,szUrl,NULL,0, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_RELOAD,0); if (hUrl == NULL) throw "error"; for(;;) { if (!InternetReadFile(hUrl,szBuf.get(),dwBuf,&dwRead)) { bRet = false; break; } if (dwRead == 0) { bRet = true; break; } //strTmp += std::string(szBuf,dwRead); WriteFile(hFile,szBuf.get(),dwRead,&dwRead,NULL); } throw "ok"; } catch(...) { if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (hUrl != NULL) InternetCloseHandle(hUrl); if (hInet != NULL) InternetCloseHandle(hInet); } return bRet;}
InternetReadFile函数
InternetReadFile Function
从一个由InternetOpenUrl, FtpOpenFile,或 HttpOpenRequest 函数打开的句柄中读取数据。
SyntaxC++BOOL InternetReadFile( __in HINTERNET hFile, __out LPVOID lpBuffer, __in DWORD dwNumberOfBytesToRead, __out LPDWORD lpdwNumberOfBytesRead);Parameters
hFile [in]
由InternetOpenUrl, FtpOpenFile,或 HttpOpenRequest 函数返回的句柄.
lpBuffer [out]
缓冲器指针
dwNumberOfBytesToRead [in]
欲读数据的字节量。
lpdwNumberOfBytesRead [out]
接收读取字节量的变量。该函数在做任何工作或错误检查之前都设置该值为零
返回值
成功:返回TRUE,失败,返回FALSE
备注
该函数的操作非常类似于ReadFile函数。典型情况下,该函数从一个作为字节顺序流的HINTERNET句柄中返回数据。每次函数读取的数据量都由dwNumberOfBytesToRead参数指定,并且数据返回到lpBuffer参数里。一个正常读取将持续到文件结束时为止。为了确保所有数据被接收,应用程序必须继续使用该函数直到函数返回TRUE且lpdwNumberOfBytesRead参数等于零值。此举在请求的数据被写入缓存中尤为重要,因为如不这样的话,缓存将不会正常的更新且下载的文件也将不会被允许写入到缓存中。注意:除了原始请求的命令设置为INTERNET_FLAG_NO_CACHE_WRITE标识的情况外,缓存操作都会自动进行。当应用程序使用InternetOpenUrl函数获得一个句柄时,WinINet试图将所有的数据都变得如同文件下载一样。
WinINet试图每次向lpBuffer缓冲中写入一行HTML。如果应用程序的缓冲区太小以至于不能承载一行的HTML数据,错误代码ERROR_INSUFFICIENT_BUFFER将发送给应用程序,通知它需要更大的缓冲区。同样,转换的行数也不一定和缓冲区的大小匹配,所以该函数可以返回比lpBuffer缓冲少的数据。接下来的读取工作将返回所有的HTML数据。应用程序必须再次检查搜有数据是否都被接收。
(InternetReadFile函数说明转自:http://hi.baidu.com/fangenhong/item/5b11fd91777e6f1b924f41e4)
- 网络下载文件小程序(非原创,他人所写)
- java网络下载小程序
- 网络---小文件的下载
- SecureCRT小技巧(非原创)
- MFC 手把手 写一个文件播放小程序(这个是直接copy的 我会动手做一遍 然后发自己原创的)
- 用COS实现文件上传(非原创,网络收集)
- PHP写的下载程序,Zip文件下载不完整。
- MFC和VC++写的电脑关机小程序(源码+下载)
- java写的电驴下载完成关机小程序
- 打算写个下载豆瓣fm歌曲的小程序
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
- 以前写的一个更换网络环境的小批处理(原创)
- STM32 无线下载程序(非IAP)
- 扫雷小程序(非界面)
- java 从网络下载视屏简短小程序
- 生活所迫-写程序
- 小时钟程序-原创Java
- 计算器小程序-Java原创
- java 数组学习
- 从零单排c++ primer(9)
- JPS命令
- 红黑树介绍
- 【数据库摘要】5_Sql_IN
- 网络下载文件小程序(非原创,他人所写)
- Asp.net数据抓取
- 《Head First Programming》---python 1_开始编码
- Android幻灯片式图片浏览器
- unity assetBundle使用image材质
- Linux下which、whereis、locate、find 命令的区别
- A New Year Gift
- VMWare 下完美安装 Mac OS X
- 如何创建jar包