zoukankan      html  css  js  c++  java
  • ftplib实战上传

    利用ftplib也可以很容易的实现文件上载,并且可以显示进度。以下是我上周末写的一段程序代码,供大家共享:
    struct REMFILE {
        struct REMFILE *next;
        int fsz;                //文件大小
        char *fnm;              //文件名称
    };

    //发送进度信息给主窗口进行显示
    static int log_progress(netbuf *ctl, int xfered, void *arg)
    {
        struct REMFILE *f = (struct REMFILE *) arg;
        int pct = (int)(xfered*1.0/f->fsz*100);
        HWND hWnd = (HWND)(AfxGetApp()->GetMainWnd()->GetSafeHwnd());
        PostMessage(hWnd,WM_PROGRESS,pct,NULL);
        return 1;
    }


    //FTP上传
    bool MyFtp::up(const string& sourceFileName, const string& targetFileName)
    {
        int sts=0;
        int fsz;

        if (!connect())
            return false;
        FtpOptions(FTPLIB_CALLBACK, (long) NULL, conn);

        struct REMFILE *f;
        f = (struct REMFILE *) malloc(sizeof(struct REMFILE));
        memset(f,0,sizeof(struct REMFILE));
        f->fnm = strdup(sourceFileName.c_str());
        fsz = TPub::getFileSize(f->fnm);
        f->fsz = fsz;
        fsz = fsz/100;
        if (fsz)
        {
            FtpOptions(FTPLIB_CALLBACK, (long) log_progress, conn);
            FtpOptions(FTPLIB_IDLETIME, (long) 1000, conn);
            FtpOptions(FTPLIB_CALLBACKARG, (long) f, conn);
            FtpOptions(FTPLIB_CALLBACKBYTES, (long) fsz, conn);
        }
        sts = FtpPut(f->fnm,targetFileName.c_str(),'I',conn);
        if (sts)
        {
          ::PostMessage((HWND)(AfxGetApp()->GetMainWnd()->GetSafeHwnd()),WM_PROGRESS,100,NULL);
        }
        free(f->fnm);
        free(f);
       
        if (!sts)
        {
            _err = "ftp error: ";
            _err = _err + FtpLastResponse(conn);
            return false;
        }
     
        return true;
    }

    其中:
    HWND hWnd = (HWND)(AfxGetApp()->GetMainWnd()->GetSafeHwnd());
    PostMessage(hWnd,WM_PROGRESS,pct,NULL);
    实现了获取主窗口句柄并发送消息给主窗口,主窗口接收到这个消息后进行运行进度的显示。代码如下:
    LRESULT CFtpTestDlg::OnProgress(WPARAM wParam,LPARAM lParam)
    {
        UpdateData(TRUE);
        int progress=(int)wParam;
        string str = "";
        str = str + TPub::intToString(progress) + "%";
        m_percent = str.c_str();
        UpdateData(FALSE);
        return 0;
    }

    最后程序运行起来之后效果如下:



    写的不对的地方请大家批评。
  • 相关阅读:
    搞不明白,乱七八糟一团浆糊
    不能让外界打乱你的生活节奏
    被人的认知刷新了
    C#识别图片上的数字
    C# @字符用法
    SQL语句优化(转摘)
    C# 根据年月获得此月第一天和最后一天,并计算工作日
    jQuery渐隐渐出的文字提示
    JQuery 拖动层
    Windows SQL Server 2012 R2 安装Intel I217-V/I218-V网卡驱动(转)
  • 原文地址:https://www.cnblogs.com/tianfu/p/1568564.html
Copyright © 2011-2022 走看看