【求助】使用CInternetFile类下载文件的问题

JHJJHJ4A554E 2009-04-01 11:43:11
写了一个从服务器上下载文件的小程序,其中有一段代码如下,

CInternetSession * pSession = new CInternetSession;

CHttpConnection * pFtpCon = pSession->GetHttpConnection((LPCTSTR)m_store_url);//m_store_url存放的是服务器地址,为http://localhost

CInternetFile* pFile = (CInternetFile*)pSession->OpenURL(m_Dir,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD);//m_Dir存放的是文件的地址,如http://localhost/测试.exe

DWORD len = pFile->SeekToEnd();

这是在下载文件的函数中的代码,下载的文件如果名字是英文的,则程序正常,可如果是中文的就会出问题。

Debug单步调试的时候,前三行都可以通过,但中文名称的文件在第四行的时候就会报错,无法返回文件大小,调试窗口的内容直接跳转到类似汇编的那个界面(不知道怎么描述了)。

调试过程中,发现如果没有在指定的服务器地址上找到要下载的文件,也会出现类似的错误,怀疑是不是在处理中文文件的时候打开文件失败。

请大家帮忙看看,问题是处在什么地方。

谢谢。
...全文
174 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JHJJHJ4A554E 2009-04-22
  • 打赏
  • 举报
回复
问题一直没解决,先结贴了。
JHJJHJ4A554E 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
引用 4 楼 JHJJHJ4A554E 的回复:
引用 1 楼 Mackz 的回复:
出错是因为pFile可能无效,使用pFile之前应该先判断指针是否有效。至于文件名是否正确,可能你的FTP服务器(不知道是哪个)对中文不支持或者本来就是错误的文件路径。


我在本机上用的是apache2.0服务器,这个支持中文名吗?

你可以用IE等直接访问一下中文文件...
[/Quote]

在IE中访问中文文件,弹出保存的对话框
oyljerry 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 JHJJHJ4A554E 的回复:]
引用 1 楼 Mackz 的回复:
出错是因为pFile可能无效,使用pFile之前应该先判断指针是否有效。至于文件名是否正确,可能你的FTP服务器(不知道是哪个)对中文不支持或者本来就是错误的文件路径。


我在本机上用的是apache2.0服务器,这个支持中文名吗?
[/Quote]
你可以用IE等直接访问一下中文文件...
JHJJHJ4A554E 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Mackz 的回复:]
出错是因为pFile可能无效,使用pFile之前应该先判断指针是否有效。至于文件名是否正确,可能你的FTP服务器(不知道是哪个)对中文不支持或者本来就是错误的文件路径。
[/Quote]

我在本机上用的是apache2.0服务器,这个支持中文名吗?
jameshooo 2009-04-02
  • 打赏
  • 举报
回复
你是怎么调用的?我看第二个参数类型是const char*,应该是UTF-8编码,所以转换之前要先把自己的串转换成utf-8编码后再提交给这个函数。
mengde007 2009-04-02
  • 打赏
  • 举报
回复
用UNICODE编码……
JHJJHJ4A554E 2009-04-02
  • 打赏
  • 举报
回复
顶起来
JHJJHJ4A554E 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jameshooo 的回复:]
文件路径转换成URL编码
[/Quote]

把空格转换成%2(具体什么忘了)这样的字符串吗?
在网上找了一个函数,如下

BOOL ConvertStringToURLCoding(CString &strDest, const char* strUTF8, int iLength)
{
strDest.Empty();
CString strTemp;
int i = 0;
while(i < iLength)
{
if ((unsigned)strUTF8[i] <= (unsigned char)0x7f)
{ //字母和数字不转换

if ((strUTF8[i] >= '0' && strUTF8[i] <= '9') ||
(strUTF8[i] >= 'A' && strUTF8[i] <= 'Z') ||
(strUTF8[i] >= 'a' && strUTF8[i] <= 'z'))
{
strDest += (char)strUTF8[i];
}

else if (strUTF8[i] == ' ') //空格转换成+号
{
strDest += '+';
}

else
{
strTemp.Format("%%%02X", (unsigned char)strUTF8[i]); //其他标点符号
strDest += strTemp;
}
i++;
}
else
{ //汉字或者其他的uft8文字,每3个字节一转
strTemp.Format("%%%02X%%%02X%%%02X", (unsigned char)strUTF8[i],
(unsigned char)strUTF8[i + 1], (unsigned char)strUTF8[i + 2]);
strDest += strTemp;
i += 3;
}
}
if (i == 0)
{
return FALSE;
}
return TRUE;
}

按照这个函数试过了,直接出错了
jameshooo 2009-04-02
  • 打赏
  • 举报
回复
文件路径转换成URL编码
菜牛 2009-04-02
  • 打赏
  • 举报
回复
出错是因为pFile可能无效,使用pFile之前应该先判断指针是否有效。至于文件名是否正确,可能你的FTP服务器(不知道是哪个)对中文不支持或者本来就是错误的文件路径。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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