using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.IO;
using System.ComponentModel;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip; namespace OnlineUpdate
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
String[] arguments = Environment.GetCommandLineArgs();
bool valid = false;
foreach (string s in arguments)
{
if (s == "update")
{
valid = true;
}
}
if (!valid)
{
Application.Current.Shutdown(); } worker = new BackgroundWorker();
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); ;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
Loaded += new RoutedEventHandler(MainWindow_Loaded); }
BackgroundWorker worker;
bool isDownloadOK = false;
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (isDownloadOK)
{
copyFiles();
}
} void worker_DoWork(object sender, DoWorkEventArgs e)
{
dowloadFile();
} private static string UpdateZipFile = "Update.rar"; void MainWindow_Loaded(object sender, RoutedEventArgs e)
{ int tryCont=0;
closedMainApp();
while (!checkHasClosedMainApp())
{
tryCont++;
MessageBox.Show("please close main app");
if(tryCont>3){
MessageBox.Show("can not do update ,need close main app");
Application.Current.Shutdown();
break ;
} } Show();
//start download update
worker.RunWorkerAsync(); } void dowloadFile()
{
isDownloadOK = false;
string StrFileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, UpdateZipFile);
string StrUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";//"https://files.cnblogs.com/files/wgscd/jyzsUpdate.zip"; //根据实际情况设置
System.IO.FileStream fs;
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream ns = response.GetResponseStream();
long totalSize = response.ContentLength;
long hasDownSize = 0;
byte[] nbytes = new byte[512];//521,2048 etc
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, nbytes.Length);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
hasDownSize += nReadSize;
Dispatcher.BeginInvoke(new Action(() =>
{
txt.Text = "" + hasDownSize + "/" + totalSize + " (" + (((double)hasDownSize * 100 / totalSize).ToString("0")) + "%)";//显示下载百分比
lbPercent.Width = gridPercent.RenderSize.Width * ((double)hasDownSize / totalSize);
txt.UpdateLayout();//DoEvents();
})); }
Dispatcher.BeginInvoke(new Action(() =>
{
txt.Text = "100%";//显示下载百分比
txt.UpdateLayout();//DoEvents();
})); fs.Close();
ns.Close();
isDownloadOK = true;
// MessageBox.Show("下载完成");
}
catch (Exception ex)
{
fs.Close();
MessageBox.Show("出现错误:" + ex.ToString());
}
} void copyFiles() { txt.Text = "正在复制解压文件......";
txt2.Visibility = System.Windows.Visibility.Collapsed;
gridPercent.Visibility = System.Windows.Visibility.Collapsed;
UnZip(UpdateZipFile, AppDomain.CurrentDomain.BaseDirectory, "");
txt.Text = "更新完成!";
txt. FontSize = 55;
txt.Foreground = new SolidColorBrush(Colors.Green);
MessageBox.Show("update Ok, now new version will start");
string mainApp = AppDomain.CurrentDomain.BaseDirectory + "\\JiayuanTool.exe";
System.Diagnostics.Process.Start(mainApp);
Application.Current.Shutdown(); } /// <summary>
/// ZIP:解压一个zip文件
/// add yuangang by 2016-06-13
/// </summary>
/// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>
/// <param name="TargetDirectory">解压到的目录</param>
/// <param name="Password">解压密码</param>
/// <param name="OverWrite">是否覆盖已存在的文件</param>
public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true)
{
//如果解压到的目录不存在,则报错
if (!System.IO.Directory.Exists(TargetDirectory))
{
System.IO.Directory.CreateDirectory(TargetDirectory);
//throw new System.IO.FileNotFoundException("指定的目录: " + TargetDirectory + " 不存在!");
} //目录结尾
if (!TargetDirectory.EndsWith("\\")) { TargetDirectory = TargetDirectory + "\\"; } using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))
{
zipfiles.Password = Password;
ZipEntry theEntry; while ((theEntry = zipfiles.GetNextEntry()) != null)
{
string directoryName = "";
string pathToZip = "";
pathToZip = theEntry.Name; if (pathToZip != "")
directoryName = System.IO.Path.GetDirectoryName(pathToZip) + "\\"; string fileName = System.IO.Path.GetFileName(pathToZip); Directory.CreateDirectory(TargetDirectory + directoryName); if (fileName != "")
{
if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName)))
{
using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = zipfiles.Read(data, 0, data.Length); if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
}
} zipfiles.Close();
}
} /// <summary>
/// 断点续传
/// </summary>
void dowloadFileWithCache()
{
string StrFileName = "d:\\wgscd2.zip"; //根据实际情况设置
string StrUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";//"https://files.cnblogs.com/files/wgscd/xxx.zip"; //根据实际情况设置
//打开上次下载的文件或新建文件
long lStartPos = 0;
System.IO.FileStream fs;
if (System.IO.File.Exists(StrFileName))//另外如果文件已经下载完毕,就不需要再断点续传了,不然请求的range 会不合法会抛出异常。
{
fs = System.IO.File.OpenWrite(StrFileName);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
lStartPos = 0;
}
//打开网络连接
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
if (lStartPos > 0)
{
request.AddRange((int)lStartPos); //设置Range值
}
System.Net.WebResponse response = request.GetResponse();
//向服务器请求,获得服务器回应数据流
System.IO.Stream ns = response.GetResponseStream();
long totalSize = response.ContentLength;
long hasDownSize = 0;
byte[] nbytes = new byte[512];//521,2048 etc
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, nbytes.Length);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
hasDownSize += nReadSize;
txt.Text = "" + hasDownSize + "/" + totalSize + " (" + (((double)hasDownSize * 100 / totalSize).ToString("0.00")) + "%)";//显示下载百分比
txt.UpdateLayout();//DoEvents();
}
fs.Close();
ns.Close();
MessageBox.Show("下载完成");
}
catch (Exception ex)
{
fs.Close();
MessageBox.Show("下载过程中出现错误:" + ex.ToString());
}
} bool checkHasClosedMainApp()
{ string path = ""; Process[] ps = Process.GetProcessesByName("JiayuanTool");
//string n= Process.GetCurrentProcess().MainModule.FileName;
foreach (Process p in ps)
{
path = p.MainModule.FileName.ToString();
return false;
} return true;
} void closedMainApp()
{ string path = ""; Process[] ps = Process.GetProcessesByName("JiayuanTool");
//string n= Process.GetCurrentProcess().MainModule.FileName;
foreach (Process p in ps)
{
path = p.MainModule.FileName.ToString();
p.CloseMainWindow();
System.Threading.Thread.Sleep(1000); } } }
}

  

UI :

<Window x:Class="OnlineUpdate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBlock Name="txt" HorizontalAlignment="Center" FontSize="22" VerticalAlignment="Center" Margin="12,-42,0,0">000/0000</TextBlock>
<Grid Name="gridPercent" Background="WhiteSmoke" VerticalAlignment="Center" Margin="12,22,0,0">
<Label Name="lbPercent" Background="Green" Width="0" HorizontalAlignment="Left"></Label>
</Grid>
<Label Name="txt2" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,80,0,0">正在下载更新...</Label> </Grid>
</Window>

  

C# online update demo的更多相关文章

  1. MyBatis注解-动态SQL 一个 SqlProvider的demo

    Provider动态语言注解 MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建 ...

  2. 通用dao的demo

          代码片段 1. [代码]整型映射工具 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package org.dave.common.databas ...

  3. JQuery 滚动条插件perfect-scrollbar

    原文地址 https://github.com/noraesae/perfect-scrollbar perfect-scrollbar Tiny but perfect jQuery scrollb ...

  4. .NET 开源SqlServer ORM框架 SqlSugar 3.0 API

    3.1.x ,将作为3.X系统的最后一个版本,下面将会开发 全新的功能 更新列表:https://github.com/sunkaixuan/SqlSugar/releases 优点: SqlSuga ...

  5. PL/SQL通过存储过程为相同数据添加序号

    在Oracle数据库中存有一串数据(Ori_Seq),数据包含不等量重复: 为方便查看与管理,现希望添加一字段(New_Seq),在原有数据的末尾为其添加一串序号,相同数据序号从小到大排列,序号长度为 ...

  6. Asp.net Core的代码移植技巧,半天将SqlSugarORM转成Core

    .net  core中有哪些被抛弃的类 1.DataTable DataRow SqlDataAdapter DataRow DataColumn DataColumn 虽然这些类不是我ORM核心功能 ...

  7. oracle 10g编程

    一.概述 1.sql语言特点 sql语言采用集合操作方式,对数据的处理是成组进行的,而不是一条一条处理,听过使用集合操作方式,可以家加快数据的处理速度. 执行sql语句时每次只能发送并处理一条语句.如 ...

  8. [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)

    转载:http://www.csdn.net/article/2015-01-22/2823659 摘要:在“漫步云端:CoreOS实践指南”系列的前几篇,分别介绍了如何架设CoreOS集群,系统服务 ...

  9. Javascript高性能动画与页面渲染

    转自:http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering No setT ...

随机推荐

  1. SD从零开始41-44

    [原创] SD从零开始41 科目确定(Account determination) 使用科目确定Using Account Determination 你将需要在几个不同的领域确定将要记账的科目: 用 ...

  2. arm64 调试环境搭建及 ROP 实战

    前言 比赛的一个 arm 64 位的 pwn 题,通过这个题实践了 arm 64 下的 rop 以及调试环境搭建的方式. 题目文件 https://gitee.com/hac425/blog_data ...

  3. springcloud 入门 6 (断路器hystrix)

    hystrix:断路器 断路器是为了解决服务故障的“雪崩”,   雪崩是指,由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请 ...

  4. C# 获得目录下所有文件或指定文件类型文件(包含所有子文件夹)

    public partial class FileGet { /// <summary> /// 私有变量 /// </summary> private static List ...

  5. Intellij IDEA去除@Autowired下划线红色提示

    Intellij IDEA通过@Autowired注入的对象,在不改变配置的情况下一直有红色下划线,虽然不影响运行,但是跟小Alan一样有强迫症的肯定受不鸟. 那么怎么去除它呢? 解决方式:改变@Au ...

  6. Javascript执行流总结

    面对各种各样的JavaScript代码,我们有时候难免会犯错.可当自己仔细研究一下,哦原来是这么回事.有时候怎么会想为什么Javascript程序会是这样执行的呢?为什么没有得到自己预期的答案呢?自己 ...

  7. LeetNode 题解之Reverse Nodes in k-Group

    1.题目描述 2.问题分析 这个题本质上还是按照链表翻转的思路来解,只是需要添加一些细节判断. 3.代码 class Solution { public: ListNode* reverseKGrou ...

  8. Unix操作系统监控详解(一)

    一.描述 监控在检查系统问题运行状况以及优化系统性能工作上是一个不可缺少的部分.通过操作系统监控工具监视操作系统资源的使用情况,间接地反映了各服务器程序的运行情况.根据运行结果分析可以帮助我们快速定位 ...

  9. mysql主从不同步问题 Error_code: 1197

    首先查看从的状态   mysql> show slave status \G *************************** 1. row *********************** ...

  10. Hyper-v UBUNTU 12.04 模板设置

    Ubuntu 12.04 模板设置 参考文档 Hyper-v安装ubuntu http://blogs.msdn.com/b/virtual_pc_guy/archive/2012/05/02/ubu ...