FTP服务器是UTF-8编码,当用CFtpConnection::PutFile上传文件,本地文件名中如果含有奇数个汉字(如"测试文.txt“),不把远程文件名转成UTF-8,不能上传成功,或者成功后显示的文件名是乱码。如果把"测试文.txt”转成了UTF-8,上传能成功,但显示出来的文件名却不准确(我的显示为“测试”没有后缀名),但把"测试文.txt”改成"测试.txt"或者“测试文档.txt”,都能正常显示出来,总之是奇数个中文字不正常,偶数个中文字就没问题。
刚在网上找了半天也没有答案,后来突发奇想,先上传,再重命名,结果居然解决了,我狂汗 - -!!!
具体:
先弄个临时的文件名,全部整成英文和数字的,不要含有中文,待他上传完成后,调用rename把刚才的临时文件名重命名为自己想要的名字(如UTF8转码后的“中国人.txt”),这样就OK了。。。。
我在运行程序时注意到,在上传完成后马上进行重命名操作会失败,而调试时是成功的,代码完全一样,唯一不同的是调试是一步一步的走,而运行是瞬间走完,所以可以判断出是间隔时间上的问题,需要在rename之前加上延时或者循环直至成功。
我的代码
BOOL bUploaded = m_pFtpConnection->PutFile(LocalPath,ServerPathTemp,FTP_TRANSFER_TYPE_BINARY,1);
if(!bUploaded)
{
AfxMessageBox("文件上传失败!");
return;
}
while(!m_pFtpConnection->Rename(ServerPathTemp,theApp.ANSIToUTF8(ServerPath)))//ANSIToUTF8是我自己写的转码函数
{
Sleep(1);
}
具体原因尚不明确,仅有此解决方法,还望大虾指明原因。