使用 WinINet 中的 FtpConnection 断点续传(上传)文件

网上搜到的在 Windows 中对 FTP 断点上传的方法都是使用 CSocket 来做的,其实使用 WinINet 中带有的类就可以实现断点上传了。直接看代码。


void CWebFtpClientCtrl::fileUpload(LPCTSTR serverName, INTERNET_PORT port, LPCTSTR userName, LPCTSTR password, LPCTSTR localFileName, LPCTSTR serverFileName)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());


    CInternetSession InetSession;
    CFtpConnection *ftp=NULL;
   
    try{               
        ftp = InetSession.GetFtpConnection(serverName, userName, password, port, 1); // 这里的最后一个参数是把模式设置为 PASV,否则不能续传
    }catch(CInternetException *pEx){
        MessageBox("不能连接服务器!请确认服务已开启","错误");       
        InetSession.Close();
        if(ftp != NULL)   
        {
            delete ftp;
            ftp = NULL;
        }
        pEx->Delete();
        return;
    }

    CInternetFile *serverFile;

    // 取服务器文件大小,不需要手工使用 CSocket 来发送 SIZE 命令来获取
    ULONGLONG size = 0;
    CFtpFileFind finder(ftp);
    if (finder.FindFile(serverFileName))
    {
        finder.FindNextFile();
        size = finder.GetLength();
    }

    if (size > 0) // 服务器已经存在就断点续传
    {
        CString str;
        str.Format("REST %ld\r\n", size); // 发送 Restore 命令
        ftp->Command(str);

        serverFile = ftp->OpenFile(serverFileName, GENERIC_WRITE); // 准备写入远程的文件


        CFile localFile; // 打开本地的文件之后,定位到需要续传的位置
        localFile.Open(localFileName, 0);
        localFile.Seek(size, 0);

    }

    // 把需要续传的部分推向服务器
    const ULONGLONG bufLen = 2048;
    char buffer[bufLen];
    while(localFile.Read(buffer, bufLen))
    {
        serverFile->Write(buffer, bufLen);

        // TODO: 数据比缓冲区长度还短的时候
    }

    serverFile->Close();
    localFile.Close();

    // 善后工作
    dlgPrompt->DestroyWindow();

    ftp->Close();
    InetSession.Close();
    if(ftp != NULL)   
    {
        delete ftp;
        ftp = NULL;
    }

   
    delete dlgPrompt;
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值