HttpQueryInfo 获取服务器文件大小 问题

qjzrd 2009-08-30 08:56:52
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <winsock.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib,"WSOCK32.lib")



long CGetServerFileSize(const char *httpurl)
{
char Buffer[32] = {0};
DWORD BufLen = sizeof(Buffer);
DWORD WIndex = 0;
long dwFileSize = 0;
HINTERNET hOpen = InternetOpen("Update1.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET HTTPConnect = InternetOpenUrl(hOpen, httpurl, NULL, 0, INTERNET_FLAG_RELOAD, 0);
::HttpQueryInfo(HTTPConnect,HTTP_QUERY_CONTENT_LENGTH, Buffer, &BufLen, &WIndex);
dwFileSize = (DWORD)atol(Buffer);
printf("%s\n", Buffer);
InternetCloseHandle(HTTPConnect);
InternetCloseHandle(hOpen);
return dwFileSize;
}

void main(void)
{
CGetServerFileSize("http://127.0.0.1/赵咏华-最浪漫的事.mp3");

}

发现要是用含有中文的名字 去获取大小就不对, 要是换成英文的文件名就可以了, 那么怎么做让它用中文的也可以呢 谢谢
...全文
1000 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-08-31
  • 打赏
  • 举报
回复
因为你下载需要知道的是content length而不是文件大小,下载完成的标志是你把整个content读下来,content不是文件的直接内容,你读“文件大小”那么多字节,是不足够的

我觉得楼主最关键的是要理解什么是http的content,
抓个包看看当文件名是中文时你到底收到了什么去理解吧

[Quote=引用 3 楼 qjzrd 的回复:]
要是不知道文件大小 你怎么知道下载完成没有呢


[/Quote]
haggard_hunan 2009-08-31
  • 打赏
  • 举报
回复
InternetReadFile如何读完了,会返回长度为0的,所以其实没有必要去开始获取长度的.....
hellolzjwx 2009-08-31
  • 打赏
  • 举报
回复
char 换成TCHAR
TCHAR 当为ANSI的时候是char 当为UNICODE的时候是wchar
qjzrd 2009-08-30
  • 打赏
  • 举报
回复
要是不知道文件大小 你怎么知道下载完成没有呢

arong1234 2009-08-30
  • 打赏
  • 举报
回复
content length只反映了服务器和你通讯的http报文的长短,文件的长度和它没有线性关系,由于编码方式的不同,同样大小的文件可能需要传输的字节长度可能完全不同,因此我个人觉得你根本不可能获得文件准确长度,例如,即使文件名不是英文的,文件类型变了,说不定长度也不对了(而且,获得文件长度的必要性也不大,contentlength也许更重要一点)
yangkunhenry 2009-08-30
  • 打赏
  • 举报
回复
你用的是char型的。换成TCHAR。

33,318

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧