Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4249453
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: WINDOWS

2010-11-10 08:17:05

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

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



写的不对的地方请大家批评。
阅读(3984) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~