设为首页 收藏本站
查看: 1193|回复: 0

[经验分享] VC实现FTP定时上传文件的实现

[复制链接]

尚未签到

发表于 2015-11-6 10:50:05 | 显示全部楼层 |阅读模式
前不久,做了一个小项目,用VC实现客户端FTP定时上传程序,其实是个比较简单的程序,只是刚开始根本不知道VC还自带FTP类,傻乎乎的自己写了Soket底层通信,结果因为基础知识不是很好,半途进展不下去,太复杂了,请教了高手才知道原来VC里自带FTP类,晕!!!下面就和大家共享一下自己的成果!(做的也不是很好,但是现在运行的挺稳定的嘻嘻)
一.需求分析:
主要任务:定时上传本地机器上的特定目录下各个局的话务原始数据到服务器端特定目录下。并进行记录操作日志
1.界面:
  仅有:读配置文件/退出即可。
2.定时器:(主要部分)
每天3:00到3:30某个时间定时上传文件。

a.上传时段:
03:00 - 03:30
b 上传规则:   例:局名:东方
上传至数据接口机 /u/gdpwg/SZDH/data/下
客户机上传文件名规则:D:/timsdata/210/traffic/20060418.rpt
服务器接收文件名规则:/timsdata/210/traffic/tr20060418.rpt
读取当天时间20060419则上传前一天的数据也就是20060418.rpt—〉tr20060418.rpt

定时器每隔10分钟检测一次,是否到了3:00或3:30。可以判断最后一位是否为0在判断,倒数第二位是否是0或3或者其他算法均可。总之如果到了3:00就开始上传文件。
3.上传文件:
根据配置文件中组合的地址,上传所有局的话务数据。
4.日志:
对上传成功失败记录日志;对程序启动时间记录日志。并形成文本文件在该程序所在目录下


二.具体实现:
1.配置文件:配置文件根据需求设置如下:
[path]
MAX_ROW = 9
path = D:/tims/timsdata/
subpath=/traffic/
[office]
officename1=111
officename2=222
officename3=333
officename4=444
[Server]
IP=111.111.1.1
port=21
username=***
pwd=***
path1=/******
path2=/******
officename1=SZDH
officename2=SZGR
officename3=TDIR
officename4=TDER
subpath=/spcdata
[startup]
time=15:36
[firstcreate]
flag=0
2.定时功能由VC中的SetTimer()和OnTimer()来实现:
void CFTPClientView::OnInitialUpdate()
{
  CView::OnInitialUpdate();
   
  SetTimer(1,600000,NULL);
   
}
void CFTPClientView::OnTimer(UINT nIDEvent)
{
    ........
      if (nHour==nTime)
    {
        if (nMinute==Minute)
        {
          if (bTimer==TRUE)
          {
              bTimer=FALSE;
              CDataTxt syslog;
              syslog.WriteLogFile("ftp上传程序启动");//写日志
              AfxBeginThread((AFX_THREADPROC)StartRun,&m_nFileStatus);


            }
        }
      
      }
      else
          bTimer = TRUE;
}
3.链接服务器:
BOOL CDataTxt::Connection()
{
    CString hostname;
    int hostport;
    CString username;
    CString password;
  
    //读配置文件 FTPClient.ini
    char a[255];
    CString s;
    GetPrivateProfileString("Server","IP","",a,255,"./FTPClient.ini");
    s.Format("%s",a);
    hostname = s;

    GetPrivateProfileString("Server","port","21",a,255,"./FTPClient.ini");
    s.Format("%s",a);
    hostport =atoi(s);
   
    GetPrivateProfileString("Server","username","",a,255,"./FTPClient.ini");
    s.Format("%s",a);
    username = s;

    GetPrivateProfileString("Server","pwd","",a,255,"./FTPClient.ini");
    s.Format("%s",a);
    password = s;

    // 连接 FTP server
    pInetSession=new CInternetSession(AfxGetAppName,(),1,PRE_CONFIG_INTERNET_ACCESS);
    try
    {
        pFtpConnection=pInetSession->GetFtpConnection(hostname,username,password,hostport,FALSE);
    }
    catch(CInternetException *pEx)
    {
        pEx->Delete();
        pFtpConnection=NULL;
        LogOffServer();//断开链接
        return false;
    }
    WriteLogFile("ftp登录成功成功");//写日志
    return true;
}

BOOL CDataTxt::LogOffServer()
{//断开链接
    if(pFtpConnection!=NULL)
    {
        pFtpConnection->Close();
        delete pFtpConnection;
    }
    delete pInetSession;
    WriteLogFile("断开与服务器的连接");
    return TRUE;
}
void CDataTxt::WriteLogFile(CString log)
{//写日志
    FILE *fp;
    CHAR strhead[30]="";
    SYSTEMTIME st;
    GetLocalTime(&st);
    memset(strhead, 0, sizeof(strhead));
    sprintf(strhead, "%4d-%02d-%02d %02d:%02d:%02d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    fp = fopen("./syslog.txt", "a+");
    if(fp!=NULL)
    {
        fwrite(strhead, sizeof(CHAR), strlen(strhead), fp);
        fwrite(log, sizeof(CHAR), strlen(log), fp);
        fwrite("/n", 1, 1, fp);
        fclose(fp);
    }
   
}
3.上传文件:
非常简单用一个函数就解决了:
pFtpConnection->PutFile(localfile,remotefile)//其中localfile是从配置文件中读取的本地文件所在目录文件名,remotefile是服务器端要创建的目录以及文件名.
//判断文件是否存在:
      CFileFind finder;
    if( !finder.FindFile(localfile) )
      {return FALSE;}
    else
        return TRUE;
//在服务器端创建文件所用函数:
pFtpConnection->CreateDirectory(s);//s为目录名,需要注意的是文件已经创建时,再创建就会返回false
              版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-135810-1-1.html 上篇帖子: C# FTP 文件 文件夹操作 上传 下载 下篇帖子: FTP 超时检测 ,C# 函数运行时超时功能改进
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表