如下代码:

// HttpDownFileDemo.cpp : 定义控制台应用程序的入口点。
//这是一个Http下载文件的例子
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>
#include <Nb30.h>
#include <wininet.h>
#pragma comment(lib, "Wininet.lib")
#pragma comment(lib, "NetApi32.lib") //初始化
HANDLE InitHttpRequest(LPCTSTR pszFile);
//写入文件
void WriteFileBuffer(HANDLE File,char *pBuff, DWORD dwLen);//入口函数
int _tmain(int argc, _TCHAR* argv[])
{//文件句柄HANDLE m_hFile;//本地文件路径TCHAR szLocalFile[MAX_PATH];//初始化ZeroMemory(szLocalFile,sizeof(szLocalFile));//本地路径lstrcpyn(szLocalFile,TEXT("C:\\按钮.png"),sizeof(szLocalFile));//初始化本地文件m_hFile = InitHttpRequest(szLocalFile);//初始化HINTERNET hSession = InternetOpen(TEXT("UrlTest"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    //下载路径std::string strRequestFileGBK = "http://183.131.195.49:81//GameClient//res/GamePlaza/Face/按钮.png";//打开文件HINTERNET hHttp = InternetOpenUrlA(hSession, strRequestFileGBK.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if(hHttp){char Temp[1024];      ULONG Number = 1;while (Number > 0){BOOL bReadFile = InternetReadFile(hHttp, Temp, 1024 - 1, &Number);if(bReadFile == FALSE){cout << "文件下载异常,错误Code:" << GetLastError() << endl;break;}//写入数据WriteFileBuffer(m_hFile,Temp, Number); }InternetCloseHandle(hHttp);InternetCloseHandle(hSession);}else{cout << "文件打开异常,错误Code:" << GetLastError() << endl;InternetCloseHandle(hSession);}//关闭文件if (m_hFile){CloseHandle(m_hFile);m_hFile = NULL;}system("pause");return 0;
}//写入数据
void WriteFileBuffer(HANDLE File,char *pBuff, DWORD dwLen)
{if (dwLen<=0)return;WriteFile(File, pBuff, dwLen, &dwLen, NULL);
}//初始化请求
HANDLE InitHttpRequest(LPCTSTR pszFile)
{HANDLE File = CreateFile(pszFile, GENERIC_READ|GENERIC_WRITE,//允许读写该文件0,NULL,OPEN_ALWAYS,//如果存在就打开文件,否则创建FILE_ATTRIBUTE_NORMAL,NULL);if (File==INVALID_HANDLE_VALUE)return File;DWORD dwFileCurrySize = GetFileSize(File, NULL) ; if (dwFileCurrySize == -1)return File;SetFilePointer(File, 0,0,FILE_END);return File;
}

上面这个Demo程序下载一般的文件是没有问题的,唯独下载带有中文字符的文件会出现下载失败的问题,如下图:

最终读取到的内容会提示“找不到文件或目录”,也就会导致下载失败,解决这个问题也很简单,如下代码:

增加一个GBK转UTF8的方法:

//GBK转UTF8
string GBKToUTF8(const std::string& strGBK)
{string strOutUTF8 = "";WCHAR * str1;int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);str1 = new WCHAR[n];MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);char * str2 = new char[n];WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);strOutUTF8 = str2;delete[]str1;str1 = NULL;delete[]str2;str2 = NULL;return strOutUTF8;
}

再将红色背景代码块替换为:

//下载路径std::string strRequestFileGBK = "http://183.131.195.49:81//GameClient//res/GamePlaza/Face/按钮.png";//GBK转UTF8std::string strRequestFileUTF8 = GBKToUTF8(strRequestFileGBK);//打开文件HINTERNET hHttp = InternetOpenUrlA(hSession, strRequestFileUTF8.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);

再次下载问题得到解决,只要将要打开的地址从GBK转换为UTF8,再使用InternetOpenUrlA打开,就没有问题了。

点击下载工程代码(VS2010)

解决InternetReadFile下载带有中文字符的文件失败的方案相关推荐

  1. 中文提交到git乱码_解决git 提交后中文字符会乱码的问题

    解决git 提交后中文字符会乱码的问题 最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitla ...

  2. 解决Python3中的中文字符编码的问题-亲测有效

    解决Python3中的中文字符编码的问题 一.原理篇: Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等.这篇文章主要介绍了Python3中的解决中文字符编 ...

  3. Response响应字符数据(解决乱码问题),字符数据(文件输出)

    Response响应字符数据(解决乱码问题),字符数据(文件输出) Request:使用request对象来获取请求数据 Response:使用response对象来设置响应数据 Reponse的继承 ...

  4. Ogre读取中文路径名的文件失败的解决办法

    Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的. 因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法: 打开OgreFileSyst ...

  5. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  6. unity 解决乱码_Unity3D脚本中文字符乱码的解决方案

    用Unity这么久,一直就听别人说遇到在脚本里面用中文字符会乱码的问题.这些问题在Visual Studio比较少,通常都是在MonoDevelop上会出现,甚至在Monodevelop编辑器,写了中 ...

  7. sqlite3打开中文路径数据文件失败解决方法

    今天用sqlite3访问中文路径的数据库文件,发现sqlite3_open函数返回失败,问度娘后,有网友建议sqlite3_open16打开,sqlite3_open16和sqlite3_open区别 ...

  8. 解决读取数据库里面中文字符乱码的问题

    最近做项目过程中要从数据库中读取一些字段,将这些字段先用实体类封装好,然后在其他java主程序中调用该字段进行匹配,奈何我操作了好几遍,总是显示数据库中中文字符乱码.数据库中样式如图1所示. 图1 数 ...

  9. cad2006激活未找到html文件,解决cad提示“cad加载自定义文件失败 未找到acad”的方法...

    下图所示的提示界面大家是不是觉得很熟悉呢?这个错误提示是出现在autocad程序中的错误之一.相比无法安装等情况这个故障的解决方法比较简单,首先我们来看看具体故障:有用户在双击打开Autocad的时候 ...

最新文章

  1. php组合设计模式(composite pattern)
  2. vscode配置、使用git
  3. wxWidgets事件处理(手机播放器连载系列2)
  4. 16、Flutter Widget - PageView;
  5. LNMP详解(十四)——Nginx日志详解
  6. spark配置lzo
  7. 【MPI0】学习资料搜集
  8. python 数据挖掘与分析实战
  9. 鸿蒙策略炒股软件安全么,鸿蒙即将全量开源 引爆国产软件板块!
  10. 基于数据驱动的故障检测(一)
  11. linux中的xorg进程占用内存资源释放
  12. 《黃帝內經》第一章《上古天真論》
  13. C语言整除、取余运算的符号问题
  14. 计算机与文秘专业有哪些课程,文秘专业开设的课程有哪些
  15. Eclipse开发工具的使用
  16. 三星手机开不了机了,一直是开机界面但是进不去
  17. 空气型母线槽和密集型(封闭式)母线槽的区别
  18. 【Idea技巧】02.Idea包进行展开
  19. Slackware 14.1 安装后记
  20. php中的explode的作用,php explode用法是什么

热门文章

  1. 文字和页面特效——实现火焰文字
  2. Qt开发(三) Qt调试运行提示::-1: error: cannot open output file debug\untitled.exe: Permission denied
  3. ansible中role角色的应用
  4. JavaScript——网页轮播图( 实现点击小圆点、图片滑动、小圆点样式改变)
  5. lan和adsl是什么信号_宽带(ADSL)和宽带(LAN)都分别是什么意思??
  6. JLinkGDBServer调试ARM linux内核
  7. 用Think Pad 系统升级程序ThinkVantage System Update时候提示 无法连接代理服务器 的解决办法...
  8. 计算机系统属性更改是灰色的,文件夹隐藏属性变灰色无法更改的原因及解决方法...
  9. Linux 设置双网卡通信,外网网卡和内网网卡
  10. 使用Tensorflow模仿HearthArena炉石卡片排名算法