queryinfo获取文件大小|用wininet的InternetReadFile如何得知文件大小

『壹』 怎么获取HTTP 302重定向的header信息

翻到以前有人发帖问过类似问题,有人回答或NULL, // proxy name. NULL indicates use default.使用异步的请求就可以了m_session = ::InternetOpen (agent_name,INTERNET_OPEN_TYPE_PRECONFIG, // use registry settings.只要HttpQueryInfo(…,HTTP_QUERY_LOCATION,…)就行了NULL, // list of local servers. NULL indicates default.INTERNET_FLAG_ASYNC) ;但以上两种方法都试过,无效,求教。如果只是想获取到被重定向到哪去,而不需要访问被重定向后的页那么就在调用HttpOpenRequest时,dwFlags参数加上INTERNET_FLAG_NO_AUTO_REDIRECT然后用HttpQueryInfo去获取信息如果又要知道重定向去哪,又要访问最终目标页,那就要在CallBack里获取了当InternetStatusCallback的dwInternetStatus为INTERNET_STATUS_REDIRECT,就是重定向是第二种情况用httpsendrequest 发送HTTP包时,如遇到网站响应是HTTP302,不能获取到302头信息和Location地址,只能获取到重定向后的结果200和重写向后的网页内容。问题就是Callback中得到的 dwInternetStatus 的值不是INTERNET_STATUS_REDIRECT使用location标签,就可以取得提出这个问题,就是因为从location 这里取不到,location 也是从HttpQueryInfo去获取的返回信息里提取的值,现在是返回信息里没有。

『贰』 如何从Internet上有效而稳定地下载文件

为了使用这个函数,只需要提供一个有效的HINTERNET句柄,这个句柄可以通过标准的InternetOpen()掉用来获 得。如果你愿意的话,你还可以将一个句柄提供给进度窗口(ID为一静态控制的标示符,用来显示状态 ),在这个函数的头几行代码中声明一些变量。Dword dwSize;这个变量被用于存储每次 调用InternetReadFile读取了多少数据。CHAR szHead[] = "Accept: */*\r\n\r\n";用于存储多个HTTP头信息。如果在调用InternetOpenUrl时不传递着个头信 息,则只允许你打开文本文件!VOID* szTemp[16384];缓冲变量,可以存储来自 Internet的16KB的文件数据。HINTERNET hConnect;这是一个HINTERNET句柄,包含请求结果(来自InternetOpenUrl)FILE * pFile;标准的C文件句柄(必须包含stdio.h)。 如果你愿意,可以使用Win32处理文件的APIif (!(hConnect = InternetOpenUrlA (hOpen, szUrl, szHead, lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0))){return INTERNET_ERROR_OPENURL;}此调用可以打开一个使用URL的Internet文件句柄。标 志表示这个文件总是被读取,而不是缓存(cache)。如果失败,则此函数返回错误,你可以给定 INTERNET_ERROR_OPENURL任何值。必须为这个函数定义所有的错误信息。也可以用一个数字替代。if(!(pFile = fopen(szFileName, "wb" ))){return INTERNET_ERROR_FILEOPEN;}此调用根据给定的文件名打开文件。如果失败则返回 另一个用户定义的错误。DWORD dwByteToRead = 0;DWORD dwSizeOfRq = 4;DWORD dwBytes = 0;这三个值分别存储文件的大小,HttpQueryInfo内容的大小和总共 读取的字节数。if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL)){dwByteToRead = 0;}此调用可以获得文件的大小。如果失败则dwByteToRead被 置为0,并且当文件被下载时不会显示百分比和总数DWORD start;DWORD end;DWORD time;time = 10;start = timeGetTime();使用这些bit必须包含mmsystem.h并链接winmm.lib,它们用于时间选择,告诉用户下载的速度。例子代码只统计了下载速度,你可以扩展这个功能,比如估计还剩多少时间。do{if (! InternetReadFile(hConnect, szTemp, 16384, &dwSize)){fclose (pFile);return INTERNET_ERROR_READFILE;}此调用循环中,每次下载一个16KB的数据 块。如果download请求失败,则文件被关闭并返回错误。if (!dwSize)break;elsefwrite(szTemp, sizeof(char), dwSize, pFile);如果dwSize为0,则意味着一个EOF,循环退出。否则由InternetReadFile读取的数据内容被写到本地文件中。dwBytes+=dwSize;if(dwByteToRead && hwndProgress){SendDlgItemMessageA(hwndProgress, idProgressBar, WM_USER+2, (dwBytes*100)/dwByteToRead, 0);UpdateWindow(hwndProgress);}这个代码中,dwBytes是从文件读取的数据量,它不断增加,如果文件长度是有效的,则进度窗口句柄被指定,进度条被更新已表示下载进度 。FLOAT fSpeed = 0;fSpeed = (float)dwBytes;fSpeed /= ((float) time)/1000.0f;fSpeed /= 1024.0f;这些bit代码用于根据所花时间计算下载速度 和读取的数据量。if(hwndProgress){char s[260];sprintf(s, "%d KB / %d KB @ %1.1f KB/s", dwBytes/1024, dwByteToRead/1024, fSpeed);SetDlgItemTextA(hwndProgress, idStatusText, s);UpdateWindow(hwndProgress);} 设置和处理进度窗口的状态文本,表示下载的文件大小和下载速度。end = timeGetTime();time = end – start;if(time == 0)time = 10;时间被更 新} // dowhile (TRUE);循环结束fflush (pFile);fclose (pFile);return 0;}最后,函数结束,关闭文件并清除硬件驱动的缓冲。返回0表示成功。使用这个代码段,按照本文所描述的那样,你可以自己编写一个程序来从 Internet上有效地、稳定地下载文件。实现细节请参见例子。

『叁』 VC++怎么获取FTP上的文件大小信息

通过CFtpFileFind 得到文件的URL之后,然后通过CHttpFile::QueryInfo 得到文件大小。

『肆』 在微擎中如何使用fansQueryInfo函数

1、数据基本操作tablename()$sql = "SELECT * FROM ".tablename('users');echo $sql;//输出 SELECT * FROM ims_users2、范围条件操作array('>', '<', '<>', '!=', '>=', '<=', 'NOT IN', 'not in', '+=', '-=');//获取adid大于269的公众号$accout = pdo_get('account', array('acid >' => '269'));//增加一次用户的错误登录次数,两次变为2即可pdo_update('users_failed_login', array('count +=' => 1),array('username' => 'qiuweinan'));3、查询pdo_get:根据条件(AND连接)到指定的表中获取一条记录array | boolean pdo_get($tablename, $condition = array(), $fields = array());//根据uid获取用户的用户名和用户Id信息//生成的SQL等同于:SELECT username,uid FROM ims_users WHERE uid = '1' LIMIT 1$user = pdo_get('users', array('uid' => 1), array('username', 'uid'));//生成的SQL等同于:SELECT username FROM ims_users WHERE username = 'qiuweinan' AND status = '1' LIMIT 1$user = pdo_get('users', array('username' => 'qiuweinan', 'status' => 1), array('username'));pdo_getcolumn:根据条件(AND连接)到指定的表中获取一条记录的指定字段string | int pdo_getcolumn($tablename, $condition = array(), $field);//根据uid获取用户的用户名//生成的SQL等同于:SELECT username FROM ims_users WHERE uid = '1' LIMIT1$username = pdo_getcolumn('users', array('uid' => 1), 'username');pdo_getall:根据条件(AND连接)到指定的表中获取全部记录array | boolean pdo_getall($tablename, $condition = array(), $fields = array(), $keyfiled = '');//获取全部启用的用户//生成的SQL等同于:SELECT * FROM ims_users WHERE status = '1'$user = pdo_getall('users', array('status' => 1));pdo_getslice:根据条件(AND连接)到指定的表中获取某个区间的记录,此函数和pdo_getall的区别是可以指定limit的值array | boolean pdo_getslice($tablename, $condition = array(), $limit = array(), &$total = null, $fileds = array(), $keyfield = '');$user = pdo_getslice('users', array(), array(0,10), $total);echo $total;pdo_fetch:根据SQL语句,查询一条记录array | boolean pdo_fetch($sql, $params = array());// :uid 是参数的一个点位符,没有使用引号,传入的第二个参数中要与SQL中的占位名称相同$user = pdo_fetch("SELECT username, uid FROM ".tablename('users')." WHERE uid = :uid LIMIT 1", array(':uid' => 1));// LIKE 占位的使用方法$user = pdo_fetch("SELECT * FROM ".tablename('users')." WHERE username LIKE :username", array(':username' => '%qiuweinan%'));pdo_fetchcolumn:根据SQL语句,查询第一条记录的第N列的值,此语句与pdo_fetch使用相同,只是此函数返回的不是一个数组而是一个字符串string | boolean pdo_fetchcolumn($sql, $params = array(), $column = 0);//获取用户的总数,返回的值是一个数字$user_total = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('users'));pdo_feachall:根据SQL语句,查询全部记录,使用方法与pdo_feach相同array | boolean pdo_fetchall($sql, $params = array(), $keyfield = '');//需要注意的是,返回的数组的键值为用户的uid$user = pdo_fetchall("SELECT username,uid FROM ".tablename('users'), array(), 'uid');4、变更pdo_insert:对指定数据表插入一条新记录int | boolean pdo_insert($tablename, $data = array(), $replace = false);//添加一条用户记录,并判断是否成功$user_data = array('username' => 'qiuweinan1','status' => '1',);$result = pdo_insert('users', $user_data);if(!empty($result)){$uid = pdo_insertid();message('添加用户成功,UID为' .$uid);}pdo_update:更新指定的数据表记录array | boolean pdo_updata($tablename, $data = array(), $condition, $glue = 'AND');//更新uid=2的用户的用户名$user_data = array('username' => 'qiuweinan2',);$result = pdo_update('users', $user_data, array('id' =>2));if(!empty($result)){message('更新成功');}pdo_delete:删除指定条件的数据int | boolean pdo_delete($tablename, $condition = array(), $glue = 'AND');//删除用户名为qiuweinan2的记录$result = pdo_delete('users', array('username' => 'qiuweinan2'));if(!empty($result)){message('删除成功');}5、运行SQLpdo_query:运行一条SQL语句int | boolean pdo_query($sql, $params = array());//更新uid=2的用户的用户名$result = pdo_query("UPDATA ".tablename('users')." SET username = :username, age = :age WHERE uid = :uid", array(':username' => 'qiuweinan2', ':age' => 18, ':uid' => 2));//删除用户名为qiuweinan2的记录$result = pdo_query("DELETE FROM ".tablename('users')." WHERE username = :username", array(':username' => 'qiuweinan2'));if(!empty($result)){message('删除成功');}pdo_run:批量执行语句boolean run($sql, $stuff = 'ims_');$sql = <<<EOFCREATE TABLE IF NOT EXISTS `ims_multisearch` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`weid` int(10) unsigned NOT NULL,PRIMARY KEY (`id`))ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `ims_multisearch_fields` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`reid` int(10) unsigned NOT NULL,`type` tinyint(1) unsigned NOT NULL DEFAULT `1`,PRIMARY KEY(`id`),KEY 'idx_reid' (`reid`))ENGINE=MyISAM DEFAULT CHARSET=utf8;EOF;pdo_run($sql);6、辅助函数pdo_fieldexists:检查表中是否存在某个字段boolean pdo_fieldexists($tablename, $fieldname);//如果shopping_goods表中不存在credit字段,则新增credit字段if(!pdo_fieldexists('shopping_goods', 'credit')) {pdo_query("ALTER TABLE ".tablename('shopping_goods')." ADD `credit` int(11) NOT NULL DEFAULT '0';");}pdo_indexexists:检查表中是否存在某个索引boolean pdo_indexexists($tablename, $indexname);//如果site_slide表中不存在multiid索引,则新增multiid索引if(!pdo_indexexists('site_slide', 'multiid')) {pdo_query("ALTER TABLE ".tablename('site_slide')." ADD INDEX `multiid` (`multid`);")}pdo_tableexists:检查数据库中是否存在某个表boolean pdo_tableexists($tablename);pdo_debug:调试运行SQL语句,显示执行过的SQL的栈情况array pdo_debug($output = true, $append = array());pdo_debug();//调用该函数结果如下Array([0] => Array([sql] => SET NAMES 'utf8';[error] => Array([0] => 00000[1] =>[2] =>))[1] => Array([sql] => SELECT `value` FROM `ims_core_cache` WHERE `key`=:key[params] => Array([:key] => setting)[error] => Array([0] => 00000[1] =>[2] =>)))

『伍』 urldownloadfile是否会用系统代理

使用java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任何其他类库。所有有时候大家就直接使用它来完成一些简单(或复杂)的功能。但是你活在伟大的{print G.F.W}后面,如果你需要访问的网站被墙了,那HttpURLConnection类就会出现连接超时的错误。这时候就需要给他设置代理(Proxy)了。 设置代理(Proxy)可以有两种方式: 1、通过设置系统属性(System.setPropery(String key, String value)的方式 首先你可以在这里看到Java支持的属性。我们可以使用其中的http.proxyHost,http.proxyPort这两个属性。顾名思义,就是分别设置代理服务器地址和代理端口。[c-sharp] view plainprint?//在你发起Http请求之前设置一下属性 System.setProperty("http.proxyHost", "www.proxy.com"); System.setProperty("http.proxyPort", "8080"); [c-sharp] view plainprint?//在你发起Http请求之前设置一下属性 System.setProperty("http.proxyHost", "www.proxy.com"); System.setProperty("http.proxyPort", "8080"); 替换上面的www.proxy.com为你的代理服务器地址或IP地址,以及相应的端口为真实端口,Http连接及可以工作了。需要注意的是如果你设置了这些属性,那么所有的Http请求都会通过代理服务器。这些属性是JVM级别的,设置了以后对所有的同类请求都有效。比如上面的是关于http的,还有关于ftp的等等。 如果你的代理服务器不需要验证,那到此就结束了。但一般都是需要验证的。但是你要是看了上面Java支持的属性列表,你就会发现那里面并没有期望中的[c-sharp] view plainprint?http.proxyUserName=username http.proxyPassword=password [c-sharp] view plainprint?http.proxyUserName=username http.proxyPassword=password 这两个属性。 这时就需要java.net.Authenticator类来完成一般的Http验证。但是java.net.Authenticator这个类却是个抽象类,我们要使用还需要实例化一下子自己的类。个人觉得这里很不方便。如下:[java] view plainprint?public class BasicAuthenticator extends Authenticator { String userName; String password; public BasicAuthenticator(String userName, String password) { this.userName = userName; this.password = password; } /** * Called when password authorization is needed. Subclasses should * override the default implementation, which returns null. * * @return The PasswordAuthentication collected from the * user, or null if none is provided. */ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, password.toCharArray()); } } [java] view plainprint?public class BasicAuthenticator extends Authenticator { String userName; String password; public BasicAuthenticator(String userName, String password) { this.userName = userName; this.password = password; } /** * Called when password authorization is needed. Subclasses should * override the default implementation, which returns null. * * @return The PasswordAuthentication collected from the * user, or null if none is provided. */ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, password.toCharArray()); } } 我们需要覆盖java.net.Authenticator类的getPasswordAuthentication()方法,并返回一个PasswordAuthentication实例。要使他起作用,还需要设置[java] view plainprint?Authenticator.setDefault(new BasicAuthenticator(userName, password)); [java] view plainprint?Authenticator.setDefault(new BasicAuthenticator(userName, password)); 这样就提供了基于Http Basic的验证,接着就可以顺畅的使用需要验证的代理了。 2、通过java.net.Proxy类。 这种方式是实例化一个Proxy类提供代理服务器的信息,如端口和地址。[java] view plainprint?Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); URLConnection conn = url.openConnection(proxy); [java] view plainprint?Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); URLConnection conn = url.openConnection(proxy); 使用代理的方式是在打开Http连接的时候同时传递一个Proxy参数。如果需要验证信息的话我们可以添加一个Http头参数来实现。[java] view plainprint?//格式如下: "Proxy-Authorization"= "Basic Base64.encode(user:password)" String headerKey = "Proxy-Authorization"; String headerValue = "Basic " + Base64.encode(user+":"+password); conn.setRequestProperty(headerKey, headerValue); //………. [java] view plainprint?//格式如下: "Proxy-Authorization"= "Basic Base64.encode(user:password)" String headerKey = "Proxy-Authorization"; String headerValue = "Basic " + Base64.encode(user+":"+password); conn.setRequestProperty(headerKey, headerValue); //………. 其中的Base64.encode(user:password)是指把用户名和密码用冒号连接起来之后使用Base64编码后的值作为值的一部分。 通过这种方式只影响特定的Http连接,但是需要对代码进行修改。这种方式下是否可以使用Authenticator还未做验证。文章知识点与官方知识档案匹配网络技能树首页概览19296 人正在系统学习中

『陆』 C++ 怎么获取FTP上所有的文件夹还有所有文件

通过CFtpFileFind递归进行查询,如果没有文件,会返回false,就不用进行再查找了。如果有文件或文件夹,通过getnext进行遍历查看就行

『柒』 求助,wininet post后HttpQueryInfo获取不到东西

错误情况是:未定义操作,请返回。 抓包看看你发出的数据,跟DZ注册发送的数据是否一样。 有些系统的cookie,可以是通过页面的js生成的。一般dz肯定会有一个session来标识当前用户(不管是登陆还是未登录)。

『捌』 怎么读取HttpSendRequest获取的数据

// Open Internet session.HINTERNET hSession = ::InternetOpen("MSDN SurfBear",PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0) ;// Connect to http://www.microsoft.com/.HINTERNET hConnect = ::InternetConnect(hSession,"http://www.microsoft.com/",INTERNET_INVALID_PORT_NUMBER,"","",INTERNET_SERVICE_HTTP,0,0) ;// Request the file /MSDN/MSDNINFO/ from the server.HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,"GET","/MSDN/MSDNINFO/",HTTP_VERSION,NULL,0,INTERNET_FLAG_DONT_CACHE,0) ;// Send the request.BOOL bSendRequest = ::HttpSendRequest(hHttpFile, NULL, 0, 0, 0);// Get the length of the file. char bufQuery[32] ;DWORD dwLengthBufQuery = sizeof(bufQuery);BOOL bQuery = ::HttpQueryInfo(hHttpFile,HTTP_QUERY_CONTENT_LENGTH,bufQuery,&dwLengthBufQuery) ;// Convert length from ASCII string to a DWORD.DWORD dwFileSize = (DWORD)atol(bufQuery) ;// Allocate a buffer for the file. char* buffer = new char[dwFileSize+1] ;// Read the file into the buffer. DWORD dwBytesRead ;BOOL bRead = ::InternetReadFile(hHttpFile,buffer,dwFileSize+1,&dwBytesRead);// Put a zero on the end of the buffer.buffer[dwBytesRead] = 0 ;// Close all of the Internet handles.::InternetCloseHandle(hHttpFile); ::InternetCloseHandle(hConnect) ;::InternetCloseHandle(hSession) ;// Display the file in an edit control.pEditCtrl->SetWindowText(buffer) ;

『玖』 presto(七)——restful api之cluster

有三个状态:节点管理器、查询管理器、是否包含协调器 由两个最开始ClusterStatsResource中的两个状态提供: 看最后一行,refreshNodesInternal。 每隔5秒来,由协调器节点主动去查询workers状态。而且在更新完成5s之后,就调用上面的refreshNodesInternal方法。通过/v1/service来获取节点信息,把新节点加入到DiscoveryNodeManager的一个map中nodeStates。 QueryManager提供了getAllQueryInfo方法给ClusterStatsResource来获取ClusterStats中的状态信息。 这个类在创建query时候,加入到 queries中 同时对每一个query添加监听器,一旦执行状态改变,就更新状态query状态即:QueryInfo 我们看到大量的信息是来自query.QueryInfo中的信息。 待续~~~

『拾』 用wininet的InternetReadFile如何得知文件大小

Visual C++如何:读取二进制文件下面的代码示例演示如何从文件中读取二进制数据。使用了 System.IO 命名空间中的两个类:FileStream 和 BinaryReader。FileStream 表示实际的文件。BinaryReader 为允许二进制访问的流提供接口。下面的代码示例使用由如何:编写二进制文件中的代码创建的称为 data.bin 的文件。示例// binary_read.cpp// compile with: /clr#using<system.dll>using namespace System;using namespace System::IO;int main() { String^ fileName = "data.bin"; try { FileStream^ fs = gcnew FileStream(fileName, FileMode::Open); BinaryReader^ br = gcnew BinaryReader(fs); Console::WriteLine("contents of :", fileName); while (br->BaseStream->Position < br->BaseStream->Length) Console::WriteLine(br->ReadInt32().ToString()); fs->Close( ); } catch (Exception^ e) { if (dynamic_cast<FileNotFoundException^>(e)) Console::WriteLine("File '' not found", fileName); else Console::WriteLine("Exception: ()", e); return -1; } return 0;}★★补充★★手上的一个VB项目(过程中发现,.Net果然是好啊),需要在一个ActiveX中实现HTTP下载功能,我是采用InternetreadFile这个API来实现,一开始的代码我是这么写的 Function Gethttpdownload(sUrl As String) As boolen Dim s As StringDim hOpen As LongDim hOpenUrl As LongDim bDoLoop As BooleanDim bRet As BooleanDim sReadBuffer As String * 2048Dim lNumberOfBytesRead As LonghOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0) bDoLoop = True Do While bDoLoop sReadBuffer = vbNullString bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead) s = s & Left$(sReadBuffer, lNumberOfBytesRead) If Not CBool(lNumberOfBytesRead) Then bDoLoop = False LoopFileName = "E:\BitSpirit\Torrent\121212.torrent"F1 = FreeFileOpen FileName For Binary As F1Put F1, , sClose F1 If hOpen <> 0 Then InternetCloseHandle (hOpen) Gethttpdownload = true End Function 上面方法,用来获取服务器上的文本类型的文件一点问题,都没有,但是用来下载二进制文件的时候 就出现问题了,里面的数据怎么也不对,研究了下载下来的文件后发现,问题外话应该是在接收数据的变量是个STRING的定长字符串上。但是在网上查了好久,甚至M$ MSDN上的一个用VB来实现下载的程也是用 string类型来接收数据的而且网上的代码写法,基本上也都是这个样,好来才好现,都是从MSDN上的哪个例程上演变过来的. 我想如果能用一个byte数组来代替定长字符串,哪可能就没有问题了,但是查看了一个VB 对Internetreadfile的申明Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer发现其定义ByVal sBuffer As String 看来只能用String了,在网上查找过程中,发现人家用VC写的程序中这人参数可以是其它的,所以查看了一下Internetreadfile的原型。发现的确可以, 所以我把internetreadfile的定义修改了一下,为了通用,我为新的internetreadfile定义了一个别名。Internetreadfilebyte申明如下:Public Declare Function InternetReadFileByte Lib "wininet.dll" Alias "InternetReadFile" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer试了一下的确可以,重新修改函数,(在这过程中发现,如果要取到正确数据,还必须取得文件大小。所以增加了HttpQueryInfo的定义)最后完整的函数Function FileDownload(sUrl As Variant) As Boolean Dim b(99) As Byte Dim EndByte() As Byte Dim s As String Dim hOpen As Long Dim hOpenUrl As Long Dim bDoLoop As Boolean Dim bRet As Boolean Dim bbuffer As Byte Dim sReadBuffer As String Dim FileName As String Dim lNumberOfBytesRead As Long Dim F1 As Integer Dim strsize As String Dim size As Long strsize = String$(1024, " ") F1 = FreeFile stTotal = vbNullString FileName = "E:\BitSpirit\Torrent\121212.torrent" Open FileName For Binary As F1 hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0) bDoLoop = True HttpQueryInfo hOpenUrl, HTTP_QUERY_CONTENT_LENGTH Or HTTP_QUERY_FLAG_NUMBER, ByVal strsize, Len(strsize), 0 size = CLng(Trim(strsize)) For j = 1 To size \ 100 bDoLoop = InternetReadFileByte(hOpenUrl, b(0), 100, lNumberOfBytesRead) Put F1, , b If Not CBool(lNumberOfBytesRead) Then Exit For Next If size Mod 100 <> 0 Then tmp = (size Mod 100) – 1 ReDim EndByte(tmp) bDoLoop = InternetReadFileByte(hOpenUrl, EndByte(0), tmp + 1, lNumberOfBytesRead) Put F1, , EndByte End If If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl) If hOpen <> 0 Then InternetCloseHandle (hOpen) Close #1 FileDownload = TrueEnd Function测试了一下,完全成功:)


赞 (0)