用 MFC 来发起 FTP 请求
文章目录
在写客户端的时候,经常要传输一些文件,有一些服务器就是用 FTP 来搭建的,这个时候,如何用客户端来发起 FTP 网络连接呢?
如果是用 MFC 来发起 FTP 文件传输请求,和使用 MFC 来发起 HTTP 请求类似,非常简单。理论基础可以仔细阅读 MSDN 上的官方文档 Steps in a Typical FTP Client Application,浏忙绪绪在这里,就贴上我自己写的代码,与大家分享一下。
样例代码如下:
/* * 通过 ftp 方式来拿文件 * @param relativePath, 服务器保存该视频摘要文件夹、相对于 ftp 跟路径的相对路径 * @notice relativePath 应该是类似于 /test 这样相对于 ftp 根路径的相对路径 * 应该以 / 开头 * @param savePath, 从远程服务器下载文件后,在本地保存的文件夹路径 */ BOOL CGetRemoteFile::GetFtpfiles(CString relativePath, CString savePath) { //通过 http GET 协议来获取并保存文件 CString remotefile = L""; CString saveFilename = L""; CInternetSession session; session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 20); session.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000); session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); /* 替换成相应的 FTP 用户名和密码 */ CFtpConnection* pFtp = session.GetFtpConnection( m_strServerIP, m_strUsername, m_strPassword, (INTERNET_PORT)m_iSeverPort); bool result = pFtp->SetCurrentDirectory(relativePath); if (!result) { AfxMessageBox(L"Can't get ftp file"); return false; } CFtpFileFind finder(pFtp); BOOL bFind = finder.FindFile( L"*", INTERNET_FLAG_RELOAD ); while (bFind) { bFind = finder.FindNextFile(); CString strPath = (LPCTSTR)finder.GetFileURL(); CString strFile = (LPCTSTR)finder.GetFileName(); CString ftpPath; ftpPath.Format(L"正在下载文件:%s/%s\n", strPath, strFile); TRACE(ftpPath); CInternetFile* pFile = pFtp->OpenFile(strFile);//注意,这里只需要传文件名 int len = pFile->GetLength(); char buf[2000]; int numread; CString filepath; filepath.Format(L"%s\\%s", savePath, strFile); TRACE(L"保存为文件%s",filepath); CFile myfile( filepath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); while ((numread = pFile->Read(buf,sizeof(buf))) > 0) { strFile += buf; myfile.Write(buf, numread); } myfile.Close(); pFile->Close(); delete pFile; } session.Close(); return true; }
文章作者 cookwhy
上次更新 2011-08-22