触摸屏应用相关技术之五——自动更新
自动更新核心是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(<);
//FileTimeToSystemTime(<, &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");
}
09-05
09-05
09-05