在写客户端的时候,经常要传输一些文件,有一些服务器就是用 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;
}