1. 程式人生 > >VC實現FTP定時上傳檔案的實現

VC實現FTP定時上傳檔案的實現

前不久,做了一個小專案,用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