有没有开源的更新程序?
我想做个软件的自动更新程序,想参考一下代码
有没有成熟好用的自动更新的代码?
功能就是
1.从服务器取得文件信息
2.把文件下载到本地
3.替换文件
功能也不复杂,实现起来也不难,我就是想参考一下别人是怎么实现的
[解决办法]
记得老妖的网站上有个自动更新的组件,你下来参考一下。我做的是从服务器端控制的,在应用程序里检测服务器上的设置,如果有更新就启动更新程序,更新程序通过ftp获得配置文件,通过配置文件,连接ftp服务器
下载所需更新的文件,并替换老的文件,替换完成后设置新版本后启动应用程序。
[解决办法]
简单的实现方式:在服务器上维护一个ini文件,里面包含了需要更新文件的版本信息,自动更新时先通过http下载该文件,然后分析版本信息,再和本地的文件作对比,可以考虑加入MD5等校验信息,确认服务端有新文件,就下载之,然后更新模块文件,如果涉及到更新自身,需要另外开辟一个进程来负责。
[解决办法]
记得前一个来月做了个自动检测版本信息的,每次打开从一个更新路径下载个XML文件,再解析出来,与本地Ini配置文件的版本号进行比较,发现有更新就进行友好提示,功能是可以实现,就是初始化窗体之前要等很久,后来把这段代码给屏蔽了。
[解决办法]
为了分数只能把我现在用的代码贴一下了,[img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/13.gif]if(SerVer.ToInt() >Form1->LocalVer)
{
if(MessageBox(Form1->Handle,"发现软件更新,现在升级吗?\n", "提示",MB_YESNO
[解决办法]
MB_ICONQUESTION) == IDYES)
{
bool IsUpDate = true;
try
{
DM->FTP->Disconnect() ;
DM->FTP->Host = "";
DM->FTP->User ="";
DM->FTP->Password = "";
DM->FTP->Port = 21;
DM->FTP->Connect();
DM->FTP->Get("你的升级的文件列表文件",ExtractFileDir(Application->ExeName) + "\\UpDate.ini",true);
DM->FTP->Quit() ;
}
catch(...)
{
}
[/img]检查版本,发现升级需求时,下载升级配置文件
if(!ShellExecute(NULL,NULL,"UpDate.exe",NULL,ExtractFileDir(Application->ExeName).c_str(),SW_SHOW))启动自动升级程序,升级程序的部分代码
{
MessageBox(Form1->Handle ,"运行更新程序失败,软件自动更新失败!","出错",NULL);
}
AnsiString sPath = ExtractFileDir(Application->ExeName) + "\\UpDate";如果要升级升级程序时
if (!DirectoryExists(sPath))
{
if (!CreateDir(sPath))
throw Exception("Cannot create UpDate directory.");
}
if (FileExists(ExtractFileDir(Application->ExeName)+"\\Update.ini"))
{
IsUpDateMe = false;
UpDateConfig = new TIniFile(ExtractFileDir(Application->ExeName)+"\\Update.ini");
Button1->Enabled = false;
try{
IdFTP->Disconnect() ;
IdFTP->Host = UpDateConfig->ReadString("FTP","FTPHost","127.0.0.1");
IdFTP->User = UpDateConfig->ReadString("FTP","FTPUser","zzbinfo");
IdFTP->Password = UpDateConfig->ReadString("FTP","FTPPassWord","zzbinfo");
IdFTP->Port = UpDateConfig->ReadInteger("FTP","FTPPort",21);
IdFTP->Connect() ;
}
catch(...)
{
MessageBox(Handle,"升级失败,不能连接升级服务器!","错误",NULL);
Button1->Enabled = true;
return;
}
int FilesNum = UpDateConfig->ReadInteger("DownLoad","FilesNum",0);
TStringList *FileNameList = new TStringList();
AnsiString FileName,SQLString;
while(FilesNum>0)//下载文件
{
FileName = "File" + IntToStr(FilesNum);
FileName = UpDateConfig->ReadString("FilesList",FileName,"");
try{
BytesToTransfer = IdFTP->Size(AnsiToUtf8(FileName));
IdFTP->Get(AnsiToUtf8(FileName),ExtractFileDir(Application->ExeName)+"\\UpDate\"+FileName,true);
}
catch(...)
{
MessageBox(Handle,"升级失败,下载文件出错!","错误",NULL);
Button1->Enabled = true;
return;
//break;
}
FileNameList->Add(FileName);
//Pro->Position = 100-100/FilesNum;
FilesNum--;
::Sleep(100);
}
IdFTP->Quit() ;
//更新文件
for(int i =0 ;i<FileNameList->Count ;i++)
{
if(FileNameList->Strings[i].UpperCase() !="UPDATA.EXE")
{
DeleteFile(ExtractFileDir(Application->ExeName)+"\"+FileNameList->Strings[i] );
CopyFileTo(ExtractFileDir(Application->ExeName)+"\\UpDate\"+FileNameList->Strings[i],ExtractFileDir(Application->ExeName)+"\"+FileNameList->Strings[i]);
}else
{
CopyFileTo(ExtractFileDir(Application->ExeName)+"\\UpDate\"+FileNameList->Strings[i],ExtractFileDir(Application->ExeName)+"\\NewUpDate.exe");
IsUpDateMe = true;
}
}
MessageBox(Handle,"你的系统已经是最新版本了","提示",NULL);
Close();
if(IsUpDateMe)启动另外一个程序,这个程序就是覆盖自动升级程序,没有其他作用
{
ShellExecute(NULL,NULL,"checkupdate.exe",NULL,ExtractFileDir(Application->ExeName).c_str(),SW_SHOWNORMAL);
::Sleep(1000);
}
[解决办法]
我的方法
1.先在服务器上建一个FTP,把需要更新的文件放在这个目录下,比如一个exe 文件
2.软件里面有个定时器去数据库里一个版本表中找版本号,如果发现自己和版本表中版本不符(傻瓜点的话可以设一个int值作为判断),就通过idftp控件去ftp服务器中下载需更新的文件。
3.执行一个批处理把下载到本机的更新文件覆盖掉!
[解决办法]
我使用的是autoupgrader这个控件,看来大家都自己动手实现了,那样最好了。