`

触摸屏应用相关技术之五——自动更新

    博客分类:
  • VC++
阅读更多

触摸屏应用相关技术之五——自动更新
自动更新核心是ftp客户端,以递归方式比较本地目录与ftp目录时间戳,如果不一致,则将远程ftp目录或者文件同步到本地。
需要注意的是,iis提供的ftp服务与本地系统,存在时区,系统时间的不一致,在进行时间戳比较时需要进行转换。另外,文件下载到本机以后,也需要修改文件的“修改时间”。
关键代码如下:
比较时间戳:
        BOOL bUpdate=TRUE;
        FILETIME   fft,lt;
        SYSTEMTIME    stFTP;
        m_pFtpFind.GetLastWriteTime(&fft);
        FileTimeToSystemTime(&fft, &stFTP);
        CTime ctu(stFTP);
        AfxGetMainWnd()->GetDlgItem(IDC_OUT)->SetWindowText(ftpname);
        CFileFind m_pFind;
        diskname=m_pathLocal+strDir+strFileName;
        diskname.Replace("/","\\");
        BOOL bExist = m_pFind.FindFile(diskname);
        if(bExist){
            bExist = m_pFind.FindNextFile();
            m_pFind.GetLastWriteTime(&lt);
            //FileTimeToSystemTime(&lt, &stLocal);
            CTime ctl(lt);
            if(ctu==ctl)
                bUpdate=FALSE;
        }
        m_pFind.Close();

下载后修改时间:
        if(bUpdate){
            BOOL bSucc = m_pFtpConnection->GetFile(ftpname,diskname,FALSE);
            struct _utimbuf  utm;
            utm.modtime = ctu.GetTime();
            utm.actime = utm.modtime;
            _utime(diskname,&utm);
            //有需要替换的系统dll,需要删除自动加载后重新启动
            if(diskname.Find(PATHDLL)!=-1){
                bDllUpdate = TRUE;
            }
            //todo regsvr32 /u 
            if(diskname.Find(".ocx")!=-1){
                CString sd;
                sd.Format("/s %s",(LPCTSTR)diskname);
                ShellExecute(NULL,NULL,"regsvr32.exe",sd,NULL,SW_SHOWNORMAL);
                log(sd,"regsvr32");
            }
            CString sf;
            sf.Format("%d %s",bSucc,(LPCTSTR)ftpname);
            log(sf,"Download");
        }

  • TS.rar (58.3 KB)
  • 下载次数: 15
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics