std::wstring Utf82Unicode(const std::string& utf8string)
{
int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
if (widesize == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (widesize == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<wchar_t> resultstring(widesize);
int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
if (convresult != widesize)
{
throw std::exception("La falla!");
}
return std::wstring(&resultstring[0]);
}
char* WCharToChar(const WCHAR* ptszSource, char* pszTarget, int nTargetLen)
{
if (NULL != ptszSource)
{
::WideCharToMultiByte(CP_ACP, NULL, ptszSource, wcslen(ptszSource), pszTarget, nTargetLen, NULL, NULL);
}
return pszTarget;
}
BOOL CMFCApplication1Dlg::FTP_Download(const char* lpszSrc, const char* lpszDst)
{
HINTERNET hInternet, hConnect, hFTPFile = NULL;
// 建立会话
hInternet = InternetOpen("WinInet Ftp", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
// 建立连接
hConnect = InternetConnect(hInternet, IP, 端口, 账号, 密码, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
unsigned long lPathsize = MAX_PATH;
char szPath[MAX_PATH] = "";
int ret = FtpGetCurrentDirectory(hConnect, szPath, &lPathsize);
WIN32_FIND_DATA lpTest;
hFTPFile = FtpFindFirstFile(hConnect, lpszSrc, &lpTest, 0, 0); //返回hFind为NULL,不正确
if (hFTPFile)
{
std::wstring wstrTemp = Utf82Unicode(lpTest.cFileName);
// const wchar_t* lp2 = wstrTemp.c_str();
char lpTemp[255] = "";
const char* lpRetData = WCharToChar(wstrTemp.c_str(), lpTemp, 254);
printf("%s\n", lpRetData);
char szSrc[256] = "";
char szDst[256] = "";
strcpy(szSrc, lpszSrc);
strcpy(szDst, lpszDst);
strcat(szSrc, "/");
strcat(szDst, "/");
strcat(szSrc, lpRetData);
strcat(szDst, lpRetData);
if (lpTest.dwFileAttributes == 16)
{
CreateDirectory(szDst, NULL);
BOOL bRET = FTP_Download(szSrc, szDst); // 判断文件属性,是文件就继续遍历
}
else
{
int iRet = FtpGetFile(hConnect, szSrc, szDst, FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);
}
int ret = 1;
while (ret)
{
ret = InternetFindNextFile(hFTPFile, (LPVOID)&lpTest); //返回hFind为NULL,不正确
if (!ret)
break;
std::wstring wstrTemp = Utf82Unicode(lpTest.cFileName);
// const wchar_t* lp2 = wstrTemp.c_str();
char lpTemp[255] = "";
const char* lpRetData = WCharToChar(wstrTemp.c_str(), lpTemp, 254);
printf("%s\n", lpRetData);
char szSrc[256] = "";
char szDst[256] = "";
strcpy(szSrc, lpszSrc);
strcpy(szDst, lpszDst);
strcat(szSrc, "/");
strcat(szDst, "/");
strcat(szSrc, lpRetData);
strcat(szDst, lpRetData);
if (lpTest.dwFileAttributes == 16)
{
CreateDirectory(szDst, NULL);
BOOL bRET = FTP_Download(szSrc, szDst); // 判断文件属性,是文件就继续遍历
}
else
{
int iRet = FtpGetFile(hConnect, szSrc, szDst, FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);
}
}
}
else
{
return -1;
}
return 0;
}