using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace BaobaoAutoUpdate
{
public partial class Form1 : Form
{
const string serviceAddressFileName = "ServiceAddress.txt";
const string versionFileName = "Version.txt";
const string unrarPathFileName = "UnrarPath.txt";
string unrarPath = "./";//解压文件存放目录,程序的目录
string downloadFileName = "";//下载的文件名
//文件下载地址
private string ServiceAddress
{
get
{
return txtURL.Text;
}
}
private string ConfigPath
{
get
{
return Environment.CurrentDirectory + "/Config/";
}
}
// string serviceAddress = "http://192.168.1.104/";
string url4DownloadFileName = "http://192.168.1.104/BBAUService/DownloadFile.html"; //从这里获取需要下载的文件名称
string url4NewVersion = "http://192.168.1.104/BBAUService/Version.html"; //从这里获取服务器版本号
//下载文件存放目录
string downloadTempPath = Environment.CurrentDirectory + "/Download/";
//下载文件保存名称
//string rarFileName = "a.rar";
//RAR压缩程序路径
string rarExePath = Environment.CurrentDirectory + "/WinRAR/WinRAR.exe";
//版本号
string versionNoOld = "";//本地的
string versionNoNew = "";//服务器的
public Form1()
{
InitializeComponent();
string serviceAddress = GetSringFromFile(ConfigPath + "/" + serviceAddressFileName); //获取服务地址
versionNoOld = GetSringFromFile(ConfigPath + "/" + versionFileName); //获取本地版本号
unrarPath = GetSringFromFile(ConfigPath + "/" + unrarPathFileName); //
if (isNull(unrarPath))
{
string currentPath = Environment.CurrentDirectory;
unrarPath = currentPath.Substring(0, currentPath.LastIndexOf("\\"));
}
txtURL.Text = serviceAddress;
txtSavePath.Text = unrarPath;
lblVersionNoOld.Text = versionNoOld;
this.Load += Form1_Load;
btnCheck.Focus();
}
void Form1_Load(object sender, EventArgs e)
{
btnCheck_Click(null, null);//检查新版本
}
//保存服务地址
private void btnSave_Click(object sender, EventArgs e)
{
try
{
BaobaoUtil.SaveStringToFile(txtURL.Text, ConfigPath, serviceAddressFileName);
BaobaoUtil.SaveStringToFile(txtSavePath.Text, ConfigPath, unrarPathFileName);
}
catch (Exception ex)
{
BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "保存文件失败失败: " + ex.Message);
}
}
//检查更新
private void btnCheck_Click(object sender, EventArgs e)
{
if (isNull(ServiceAddress))
{
lblMsg.Text = "服务地址不能为空!";
return;
}
url4DownloadFileName = ServiceAddress + "/BBAUService/DownloadName.html";
url4NewVersion = ServiceAddress + "/BBAUService/Version.html";
lblVersionNoNew.Text = "";
lblUpdateFileName.Text = "";
Thread thread = new Thread(new ThreadStart(DoCheck));
thread.Start();
}
private void DoCheck()
{
BeginInvoke(new Del_DoCheck_Msg(CheckBegin), "");
if (!isNull(url4NewVersion))
{
//获取服务器版本号
try
{
versionNoNew = BaobaoUtil.GetStringFromURL(url4NewVersion);
downloadFileName = BaobaoUtil.GetStringFromURL(url4DownloadFileName);
BeginInvoke(new Del_DoCheck_Msg(CheckFinish), "");
}
catch (Exception e)
{
BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "调用服务[" + url4NewVersion + "]或[" + url4DownloadFileName + "]失败:\n" + e.Message);
BeginInvoke(new Del_DoCheck_Msg(CheckFinish), e.Message);
}
}
}
private void CheckBegin(string msg)
{
SetButtonEnabled(false);
if (isNull(msg))
{
lblMsg.Text = "检查中...";
}
else
{
lblMsg.Text = msg;
}
}
private void CheckFinish(string msg)
{
SetButtonEnabled(true);
lblVersionNoNew.Text = versionNoNew;
lblUpdateFileName.Text = downloadFileName;
if (isNull(msg))
{
//比对版本号
if (versionNoOld.CompareTo(versionNoNew) < 0)
{
//提示有新版本
lblMsg.Text = "发现新版本!";
}
else
{
lblMsg.Text = "已是最新版本!";
}
}
else
{
lblMsg.Text = msg;
}
}
//下载,并解压
private void btnUpdate_Click(object sender, EventArgs e)
{
if (versionNoOld.CompareTo(versionNoNew) < 0)
{
}
else
{
if (DialogResult.OK != MessageBox.Show("已是最新版本! 确定进行更新吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information))
{
return;
}
}
if (isNull(downloadFileName))
{
ShowMsg("在位置[ " + url4DownloadFileName + " ]没有获取到下载文件名 ");
return;
}
lblMsg.Text = "正在更新程序,下载中...";
unrarPath = txtSavePath.Text;
SetButtonEnabled(false);
Thread thread = new Thread(new ThreadStart(Update2NewVersion));
thread.Start();
//BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在更新程序,下载中...");
//Update2NewVersion();
}
//更新程序到新版本,新线程中进行
private void Update2NewVersion()
{
string urlDownload = ServiceAddress + "/BBAUService/" + downloadFileName;
try
{
//TODO 开线程做进度条
// BaobaoUtil.HttpDownloadFile(urlDownload, downloadTempPath, rarFileName, progressBar1);
//BaobaoUtil.HttpDownloadFile2(urlDownload, downloadTempPath, rarFileName, updateProgress);
HttpDownloadFile(urlDownload, downloadTempPath, downloadFileName);
//下载完成后,显示解压中
ShowPro(100);
BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在更新程序,解压中...");
if (BaobaoUtil.UnRAR(unrarPath, downloadTempPath, downloadFileName, rarExePath))
{
//保存新的版本号等
BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在完成更新...");
if (!isNull(versionNoNew))
{
//保存配置文件
btnSave_Click(null, null);
//保存新的版本号
BaobaoUtil.SaveStringToFile(versionNoNew, ConfigPath, versionFileName);
}
}
BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "更新完成!");
ShowPro(-100);
}
catch (Exception ex)
{
BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "从[" + urlDownload + "]下载失败: " + ex.Message);
}
}
//读取文件中的文本
private string GetSringFromFile(string path)
{
StreamReader sRead = null;
try
{
if (File.Exists(path))
{
sRead = new StreamReader(path);
string result = sRead.ReadLine().Trim();
return result;
}
}
catch (Exception e)
{
BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "读取文件失败失败: " + e.Message);
}
finally
{
if (null != sRead)
{
sRead.Close();
}
}
return "";
}
private void SetButtonEnabled(bool enabled)
{
btnCheck.Enabled = enabled;
btnUpdate.Enabled = enabled;
}
public delegate void Del_DoCheck_Msg(String msg);
//提示对话框
private void ShowMsg(string msg)
{
lblMsg.Text = msg;
MessageBox.Show(msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void UpdateMsg(string msg)
{
lblMsg.Text = msg;
}
public static bool isNull(string str)
{
return string.IsNullOrWhiteSpace(str);
}
private delegate void ProgressBarShow(int i);
private void ShowPro(int value)
{
if (this.InvokeRequired)
{
this.Invoke(new ProgressBarShow(ShowPro), value);
}
else
{
if (value == -100)
{
SetButtonEnabled(true);
progressBar1.Value = 0;
}
else
{
progressBar1.Value = value;
}
}
}
public string HttpDownloadFile(string url, string savePath, string saveFileName)
{
Directory.CreateDirectory(savePath);//创建目录,有目录了会忽略
string filePath = savePath + "/" + saveFileName; //保存的文件的绝对路径
Stream responseStream = null;
Stream stream = null;
HttpWebResponse response = null;
try
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
response = request.GetResponse() as HttpWebResponse;
long resLength = response.ContentLength; //总大小
string resType = response.ContentType;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
responseStream = response.GetResponseStream();
//创建本地文件写入流
stream = new FileStream(filePath, FileMode.Create);
byte[] bArr = new byte[102400]; //一次读取 100K
int size = responseStream.Read(bArr, 0, (int)bArr.Length); //一次读取 100K
long dowLength = 0; //已经下载的大小
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length); //一次读取 100K
dowLength += size; //已经下载的大小
int per = Convert.ToInt32(100 * dowLength / resLength);
this.ShowPro(per);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (null != stream)
{
stream.Close();
}
if (null != stream)
{
responseStream.Close();
}
if (null != response)
{
response.Close();
}
}
return filePath;
}
}
}
分享到:
相关推荐
据描述,运营者在没有进行任何推广的情况下,每天自然流量能达到一千用户左右,而且用户粘性很高,这意味着小程序的设计和内容吸引了大量用户,并能持续保持他们的活跃度。这也从侧面反映了小程序在用户体验和功能...
4. 更新与维护:小程序的更新直接推送,用户无感知,而APP需要用户手动更新。 5. 用户获取:小程序依托微信的巨大用户基数,获取用户更加便捷,而APP需要通过多种渠道推广。 【小程序发展历程】 从张小龙首次提出...
2. 推送管理功能:通过微信小程序的推送消息功能,可以向用户及时传递志愿服务的相关信息,包括活动更新、重要通知等。推送管理功能对于提高用户参与度、保持用户活跃度都有积极作用。 3. 志愿者浏览、报名功能:...
阳淘微信小程序是基于这一平台开发的一个具体实例,据描述,它是一个持续更新的项目。 1. 微信小程序基础: - 构建环境:微信开发者工具,提供了一站式的开发环境,包括代码编辑、预览、调试和发布等功能。 - ...
据腾讯数据显示,每天有数以亿计的用户使用微信,因此基于微信平台开发的小程序具有极大的市场潜力和用户覆盖范围。 9. 微信小程序的开发实践: 家校微信小程序的开发实践表明,通过云服务器部署数据库,使用轻量化...
独立版微猫恋爱聊妹术小程序源码带前端多开版,全新主题、全新UI、全方面支持分享朋友圈功能,全新独立后台大更新,让操作更简单!课堂页面、搜索页面、子话术列表页面等,均增加流量主展示,超多功能。 教程开始 ...
2021年发布的这款恋爱话术小程序,据描述是经过了微信平台的严格审核,意味着它符合微信的小程序开发规范,能够顺利在微信生态系统中运行。更重要的是,这款源码是开源的,这意味着开发者可以自由地查看、使用、修改...
小程序的能力不断更新,流量入口逐渐放开,吸引了第三方开发平台如“即速应用”的关注。这些平台提供了多种行业模板,降低了开发门槛,使得中小企业重新看到商机。随着支付宝、小米、Google等其他平台的跟进,小程序...
在接下来的一年里,微信不断更新小程序的能力,开放更多流量入口,并通过第三方开发平台如“即速应用”的助力,提供了餐饮、电商、旅游、房产等多个行业的定制化模板,降低了开发门槛。这使得中小企业看到了新的商业...
这款小程序的修改版,通过独特的功能设计,为商家提供了一个稳定且长期盈利的项目方案。 首先,我们要理解小程序的核心功能。365锦鲤助手小程序的主要特性在于它的砍价机制。拼多多的商品砍价功能是吸引消费者的一...
据统计,2020年微信小程序的日活跃用户超过4亿,餐饮相关小程序超过20万个,日均交易金额达1.5亿,显示了其巨大的市场潜力。此系统不仅方便用户快速点餐、支付,还帮助商家减少人力成本,吸引并保留更多客户。对于...
据统计,小程序的用户群体涵盖了各个年龄段,特别是在年轻人群体中,小程序的使用频率极高。这些用户对于新颖的服务体验有着极高的接受度,愿意尝试各种小程序提供的服务。 ##### 4. 小程序特点分析 - **微信小...
### 基于微信小程序的云看护健康管理系统的关键知识点 #### 1. 研究背景与意义 - **社会需求**:随着人口老龄化加剧和年轻人生活压力增大,健康管理需求日益凸显。据统计,截至2018年底,中国60岁及以上人口达到2....
基于微信小程序的物业缴费系统的设计与实现的主要使用者分为服务端和微信端,实现功能包括管理员:首页、个人中心、业主管理、抄表员管理、更新通知管理、公告栏管理、费用类型管理、费用缴纳管理、欠费通知管理、...
据统计,餐饮小程序的使用率和流量在不断攀升,显示出其在行业内的潜力。 其次,小程序能够实现美食推荐和冲动订单。用户可以直接分享菜品,增进朋友间的美食交流,而无需通过复杂的APP操作。这种无缝对接使得消费...
据数据统计,截至2008年,微信小程序用户量已超过3亿,这为云笔记小程序的推广提供了庞大的用户基础。 ##### 1.2 功能设计 为了满足用户多样化的需求,云笔记小程序设计了多种核心功能: 1. **文字笔记功能**:...
4. **维护方便**:开发者可以随时更新小程序的内容和服务,无需用户重新下载安装。 #### 三、图书馆座位预约系统的现状 图书馆作为重要的学习和研究场所,其座位资源往往十分紧张。传统的人工管理方式效率低下,...
该版本5.6.5是经过更新优化后的版本,据描述所示,已有人验证其可用性,表明此版本在功能性和稳定性上达到了一定的标准。 一、外卖小程序核心功能 1. 用户界面:小程序设计简洁易用,提供快速浏览菜单、下单、支付...