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;
    }

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



    写的不对的地方请大家批评。
  • 相关阅读:
    vm8.0安装mac提示中断导致虚拟cpu进入终止状态……vm重启的解决办法
    WPF和WindowsForm下的按下Enter跳转下一个控件通用方法
    【Z】oledb读写excel出现“操作必须使用一个可更新的查询”错误
    关于系统编码的那点事
    【Z】使用OleDbCommandBuilder时出现“Insert into 语句的语法错误”
    Thread 初学(二)——线程同步
    Oracle中针对一张表建立触发器,并且触发器也处理同一张表的数据(ora04091 错误)
    Thread初学 (一)
    【Z】使用SQL Server的OPENROWSET函数
    13个绚丽的Jquery 界面设计
  • 原文地址:https://www.cnblogs.com/tianfu/p/1568564.html
Copyright © 2011-2022 走看看