forked from saucepleez/taskt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
frmUpdating.cs
173 lines (136 loc) · 5.25 KB
/
frmUpdating.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Compression;
using System.IO;
namespace taskt_updater
{
public partial class frmUpdating : Form
{
string topLevelFolder = Application.StartupPath;
public frmUpdating(string packageURL)
{
InitializeComponent();
bgwUpdate.RunWorkerAsync(packageURL);
}
private void bgwUpdate_DoWork(object sender, DoWorkEventArgs e)
{
//get package
bgwUpdate.ReportProgress(0, "Setting Up...");
//define update folder
var tempUpdateFolder = topLevelFolder + "\\temp\\";
//delete existing
if (Directory.Exists(tempUpdateFolder))
{
System.IO.Directory.Delete(tempUpdateFolder, true);
}
//create folder
System.IO.Directory.CreateDirectory(tempUpdateFolder);
//cast arg to string
string packageURL = (string)e.Argument;
bgwUpdate.ReportProgress(0, "Downloading Update...");
//create uri and download package
Uri uri = new Uri(packageURL);
string localPackagePath = System.IO.Path.Combine(tempUpdateFolder, System.IO.Path.GetFileName(uri.LocalPath));
//if package exists for some reason then delete
if (System.IO.File.Exists(localPackagePath))
{
System.IO.File.Delete(localPackagePath);
}
//create web client
System.Net.WebClient newWebClient = new System.Net.WebClient();
//download file
newWebClient.DownloadFile(uri, localPackagePath);
bgwUpdate.ReportProgress(0, "Extracting Update...");
using (FileStream zipToOpen = new FileStream(localPackagePath, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ExtractZipToDirectory(archive, tempUpdateFolder, true);
}
}
//create deployment folder reference
var deploymentFolder = tempUpdateFolder + "taskt\\";
bgwUpdate.ReportProgress(0, "Deployed to " + deploymentFolder);
bgwUpdate.ReportProgress(0, "Updating Files...");
//copy deployed files to top level
CopyDirectory(deploymentFolder, topLevelFolder);
//clean up old folder
// System.IO.Directory.Delete(tempUpdateFolder);
}
public void ExtractZipToDirectory(ZipArchive archive, string destinationDirectoryName, bool overwrite)
{
if (!overwrite)
{
archive.ExtractToDirectory(destinationDirectoryName);
return;
}
foreach (ZipArchiveEntry file in archive.Entries)
{
string completeFileName = Path.Combine(destinationDirectoryName, file.FullName);
if (file.Name == "")
{// Assuming Empty for Directory
Directory.CreateDirectory(Path.GetDirectoryName(completeFileName));
continue;
}
file.ExtractToFile(completeFileName, true);
}
}
public void CopyDirectory(string source, string target)
{
var stack = new Stack<Folders>();
stack.Push(new Folders(source, target));
while (stack.Count > 0)
{
var folders = stack.Pop();
Directory.CreateDirectory(folders.Target);
foreach (var file in Directory.GetFiles(folders.Source, "*.*"))
{
File.Copy(file, Path.Combine(folders.Target, Path.GetFileName(file)), true);
}
foreach (var folder in Directory.GetDirectories(folders.Source))
{
stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
}
}
}
private void frmUpdating_Load(object sender, EventArgs e)
{
}
private void bgwUpdate_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblUpdate.Text = e.UserState.ToString();
//MessageBox.Show(e.UserState.ToString());
}
private void bgwUpdate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error is null)
{
System.Diagnostics.Process.Start(topLevelFolder + "\\taskt.exe");
this.Close();
//MessageBox.Show("All Done");
lblUpdate.Text = "All Done!";
}
else
{
MessageBox.Show(e.Error.ToString());
}
}
}
public class Folders
{
public string Source { get; private set; }
public string Target { get; private set; }
public Folders(string source, string target)
{
Source = source;
Target = target;
}
}
}